Модераторы: Snowy, Alexeis, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Масштабирование и просмотр графа 
:(
    Опции темы
Vitaly333
Дата 22.11.2006, 01:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 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 не знаю если кто знает подскажите , желательно с примером кода.
PM MAIL   Вверх
Alexeis
Дата 22.11.2006, 14:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(Vitaly333 @  22.11.2006,  01:26 Найти цитируемый пост)
Задавал 200-300 вершин без увеличения размеров Image и их перемещал - всё происходило плавно и красиво. А стоит  задать 20 вершин и их разбросать на значительно далеком расстоянии друг от друга а потом попробовать переместить хотя бы 5 из них - то получается сильные тормоза и рывки.

  При разбросе вершин на значительное растояние размеры исходного Timage менялись?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Vitaly333
Дата 22.11.2006, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 6.11.2006
Где: Volgograd

Репутация: нет
Всего: 2



Цитата

При разбросе вершин на значительное растояние размеры исходного Timage менялись? 


Да.
PM MAIL   Вверх
Alexeis
Дата 22.11.2006, 16:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Vitaly333, Многое зависит от кода перерисовки. Так сразу сложно сказать насколько неэффективно используется память и могло ли это повлиять на скорость.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Bitter
Дата 22.11.2006, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 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
PM MAIL ICQ Skype   Вверх
Alexeis
Дата 22.11.2006, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 55
Всего: 459



Цитата(Bitter @  22.11.2006,  22:48 Найти цитируемый пост)
Конечно тормозит! Это ж Image - он сам по себе тормознутый! Больших размеров этого Имаджа нельзя допускать. 

Да ничего вроде, если работать с его битмапом получается довольно нормально, только он после этого требует вызова Invalidate, поскольку не всегда определяет что изображение изменилось.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
Bitter
Дата 23.11.2006, 00:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

Репутация: 6
Всего: 27



Не, ну конечно, его удобно использовать, но если приходится его часто перерисовывать, то при больших размерах он тормозит, так как GDI тормозит по дефоулту :-)
PM MAIL ICQ Skype   Вверх
Vitaly333
Дата 24.11.2006, 14:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 6.11.2006
Где: Volgograd

Репутация: нет
Всего: 2



Цитата

1. Вводишь понятие "камера". Задаешь её координаты.



В качестве камеры я взял прямоугольник: 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) , там есть ссылка на программу, и скажите чё я не так делаю.   

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Girder, Snowy.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




[ Время генерации скрипта: 0.0557 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.