![]() |
|
Модераторы: Snowy, Alexeis, MetalFan |
![]()
|
|
| Vitaly333 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 6.11.2006 Где: Volgograd Репутация: нет Всего: 2 |
Написал редактор графов на Delphi. Графы вырисовываются на компоненте Image(на канве).
Все вершины и ребра в программе храняться в виде двух динамических списков. В программе есть след. осн. функции: 1.Добавления в список. 2.Удаления из списка. 3.ВЫрисовывание вершин(ребер). 4.Удаление вершин(ребер). 5.Перемещение вершин(ребер). 6.Перерисовка графа. и др. Вершины рисуются по щелчку мыши,т.е пользователь щелкнул мышью в обл. компонента Image, программа получила координаты X,Y И нарисовала вершину. Перемещение происходит так: 1. Пользователь выделил несколько вершин. 2. Щелкнул по одной из них и зажал кнопку мыши. 3. Переместил мышь на новое место. Вершина удалилась со старого места, её координаты получили приращение dx,dy и и нарисовалась на новом мете. Остальные выделенные вершины получили тоже самое приращение dx,dy и также нарисовались на новом месте. Естеств. сначала компонент Image имеет определенные разеры (напр. Left:=0,Top:=0,Width:=100,Height:=100). Если пользователь щелкает на границе Image (напр. X=(95-100) или Y=(95-100)), то границы Image1 И самой картинки увеличиваются так (Image1.Width:=X+100;Image1.Picture.Bitmap.Width:=X+100) или (Image1.Heigth:=Y+100;Image1.Picture.Bitmap.Heigth:=Y+100). Т.е размеры графа увеличиваются. Тоже самое происходит если пользователь перемещает вершину графа за границы Image , то также границы Image и границы картинки увеличиваются. Для того что бы пользователь мог просмотреть всю картинку я закинул Image в ScrollBox. При перемещении вершин граф надо постоянно перерисовывать(анимация). Но когда размеры Image И Image1.Picture.Bitmap - становяться достаточно большими, процесс перемещения вершин очень сильно затормаживается. Задавал 200-300 вершин без увеличения размеров Image и их перемещал - всё происходило плавно и красиво. А стоит задать 20 вершин и их разбросать на значительно далеком расстоянии друг от друга а потом попробовать переместить хотя бы 5 из них - то получается сильные тормоза и рывки. Чувствую я что не рационально использую память картинки и самого Image. Думаю что нужно отображать только то что, действительно необходимо,т.е только ту часть Image которую просматривает пользователь. Но как это сделать на Delphi не знаю если кто знает подскажите , желательно с примером кода. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
При разбросе вершин на значительное растояние размеры исходного Timage менялись? -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Vitaly333 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 6.11.2006 Где: Volgograd Репутация: нет Всего: 2 |
Да. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Vitaly333, Многое зависит от кода перерисовки. Так сразу сложно сказать насколько неэффективно используется память и могло ли это повлиять на скорость.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 6 Всего: 27 |
Конечно тормозит! Это ж Image - он сам по себе тормознутый! Больших размеров этого Имаджа нельзя допускать.
Помниться делал я модель предприятия в виде Case средства, так там можно было размещать элементы предприятия (в твоём случае вершины графа) на бесконечном поле. А делается это довольно просто (я уже тебе описывал такой способ): 1. Вводишь понятие "камера". Задаешь её координаты. 2. Создаешь Image постоянных размеров (т.е. в процессе работы проги, размеры не меняешь). Это - область вывода или область видимости камеры. 3. Выводишь на Имадж только те вершины, которые попадают в область видимости камеры: if ( (Vertex.x - Camera.x) > 0 ) and ( ( Vertex.y - Camera.y ) > 0 ) and ( (Vertex.x - Camera.x) < W ) and ( ( Vertex.y - Camera.y ) < H ) then // Draw Рисовать вершину нужно в точке (Vertex.x - Camera.x), (Vertex.y - Camera.y). Изменяя координаты камеры, будет смещаться всё тобою нарисованное. При этом хранить тебе нужно только координаты вершин. Пример кода впадла писать... Если очень надо, то напишу, а вообще попробуй сам... Добавляя вершину на рабочее поле, записываешь её координаты таким образом: Vertex.x := Mouse.x + Camera.x Vertex.y := Mouse.y + Camera.y |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 55 Всего: 459 |
Да ничего вроде, если работать с его битмапом получается довольно нормально, только он после этого требует вызова Invalidate, поскольку не всегда определяет что изображение изменилось. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Bitter |
|
|||
![]() Опытный лентяй ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1209 Регистрация: 15.8.2004 Где: Харьков, Ukraine Репутация: 6 Всего: 27 |
Не, ну конечно, его удобно использовать, но если приходится его часто перерисовывать, то при больших размерах он тормозит, так как GDI тормозит по дефоулту :-)
|
|||
|
||||
| Vitaly333 |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 220 Регистрация: 6.11.2006 Где: Volgograd Репутация: нет Всего: 2 |
В качестве камеры я взял прямоугольник: Rect(x1,y1,x1+w,y1+h), где x1 -ScrollBox1.HorzScrollBar.Position y1 - ScrollBox1.VertScrollBar.Position w,h-исходные размеры Image. Т.е т.к у меня Image1 закинут в ScrollBox, то пользователь , просматривая любую часть бесконечно - большого Image видит только вот этот Rect, а это значит что в процессе перемещения вершин нужно обновлять и перерисовыввать не весь Image, а только вот этот Rect. Для этого я написал отдельные процедурки для обновления и перерисовки только части Image Refresh(Rect:Trect) и Redraw(Rect:Trect) и всё заработало!!! Вот только осталось маштабирование зделать, так и до конца я не понял как правильно его сделать. Ребята пожалуйста посмотрите мой пример Маштабирования ,который я приводил в этом топике ( Масштабирование объектов, находящихся в Image) , там есть ссылка на программу, и скажите чё я не так делаю. |
|||
|
||||
![]()
|
| Правила форума "Delphi: Звук, графика и видео" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делится вскрытыми компонентами
FAQ раздела лежит здесь! Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |