Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.119.14.235] |
|
Страницы: (2) [1] 2 все ( Перейти к последнему сообщению ) |
Сообщ.
#1
,
|
|
|
Привет Всем! Хотелось бы разобраться с тем как работает AutoCad, алгоритмы изнутри. Я создаю программу пока для себя, которая будет отображать карту города с коммуникациями. Дошел до этапа, когда нужно работать со слоями. Т.е. порядок отображения слоев. В формате моего спецфайла лежат фигуры-объекты разной длинны. У каждого объекта есть свойство - слой. Не знаю как быстро отрисовать слои. Т.е. например, рисуем слой границ кварталов или районов города, затем рисуем дома и дороги поверх слоя кварталов. В моем спецфайле фигуры лежат хаотично, т.е. в моем случае придется пробегать по спецфайлу и отрисовывать слои по порядку. Т.е. первый слой, второй слой и т.д. Что займет не одну секунду как у меня сейчас, а 5-6, может и более. Как отрисовка слоев происходит в автокаде, уж не с помощью ли "индексов". Тогда как их создать и корректировать во время добавления в карту объектов или удаления, или перемещения объектов из слоя в слой. Если есть у кого соображения по этому поводу, очень рад буду послушать.
Заранее Спасибо. |
Сообщ.
#2
,
|
|
|
На самом деле, в АвтоКаде прорисовка НЕ ОБЯЗАТЕЛЬНО происходит по слоям.
|
Сообщ.
#3
,
|
|
|
Цитата Faust, 08.09.03, 16:51:52 На самом деле, в АвтоКаде прорисовка НЕ ОБЯЗАТЕЛЬНО происходит по слоям. Хорошо, я с AutoCad'ом не так хорошо знаком, мне главное принцип проработать прорисовки. В программе у меня будут закрашенные фигуры и просто фигуры без закраски. Так вот те фигуры, которые закрышенные они будут закрывать все те фигуры, которые находятся под "ними", т.к. нет порядка. Как внесли фигуры в спецфайл, так они и лежат. А я хочу, чтобы был порядок прорисовки. Представьте, у меня есть несколько нарисованных домов и фигура квартала. Дома это закрашенные фигуры, квартал тоже имеет свой цвет заливки. Теперь если в файле порядок фигур таков, что квартал рисуется после домов, согласно положению в файле, то он закроет, затрет все дома. Или все таки мне придется прорисовывать слои по порядку 1,2,... Но у меня в программе заложено 32 слоя, перебирать всю карту на предмет слоев 32 раза нерационально. |
Сообщ.
#4
,
|
|
|
Если работа идет со слоями.. то обязательно должнен быть фиксированный порядок слоев, то есть для каждого слоя должен быть его своеобразный приоритет 0,1 и т.д. и от этого никуда не денешься, или же ипользовать что то типа Фотошоповского multiply, но при этом соответственно будет цветое искажение..
|
Сообщ.
#5
,
|
|
|
Да. Вырисовывается совсем не быстродействующая картина. У меня выделяется под спецфайл кусок памяти. И из этого куска-буфера я считывать должен 32 раза, т.к. число слоев в карте именно столько и определено - железно.
Есть еще мысля для каждого слоя создавать свой буфер, т.е.32 штуки буфера. И при прорисовке карты перебирать все не пустые буфера и выводить из них информацию на экран. Таким образом не будет перебора одних и тех же данных. Что несомненно повлечет к ускорению. Но все таки хотелось бы по системному, так сказать, подойти к этому вопросу. Как правильно это сделать? П.С. на сегодняшний день у меня прорисовывается карта города без коммуникаций и без наваротов (одним цветом и без закраски фигур, проволочная графика) всего за 1 сек. Но с увеличением функциональнгости это время станет больше, думаю секунд 5 и при скролинге будет не совсем удобно. |
Сообщ.
#6
,
|
|
|
Так навскидку я вижу тут такие 5 елементов задачи:
1) Придумать структуру, позволяющую быстро находить данные по определенному набору критериев. Какая-нибудь БД с индексно-последовательным доступом: их туева хуча реализаций. 2) Разделение объектов по слоям (кстати, а оно таки нужно 32 слоя? может меньше можно?). Индекс по слоям. 3) С каждым объектом ассоциировать атрибут, эээ... назовем его "включающий многоугольник" (удобнее четырехугольник), для того, чтобы можно было быстро определить, попадает ли объект в отображаемую область карты. Индексы по левой, правой, верхней и нижней стороне етого прямоугольника. 4) С каждым объектом ассоциировать атрибут "геом. размер" -- число, на основании которого принимать решение, отрисовывать ли объект при данном масштабе отображения карты. Индекс по етому параметру тоже. 5) Имея все вышеизложенное, научиться строить план отрисовки участка карты, в который попадают объекты, которые таки да, надо нарисовать, и попадают в том порядке, в каком они будут нарисованы. |
Сообщ.
#7
,
|
|
|
Цитата Visitor, 09.09.03, 12:37:40 Так навскидку я вижу тут такие 5 елементов задачи: 1) Придумать структуру, позволяющую быстро находить данные по определенному набору критериев. Какая-нибудь БД с индексно-последовательным доступом: их туева хуча реализаций. 2) Разделение объектов по слоям (кстати, а оно таки нужно 32 слоя? может меньше можно?). Индекс по слоям. 3) С каждым объектом ассоциировать атрибут, эээ... назовем его "включающий многоугольник" (удобнее четырехугольник), для того, чтобы можно было быстро определить, попадает ли объект в отображаемую область карты. Индексы по левой, правой, верхней и нижней стороне етого прямоугольника. 4) С каждым объектом ассоциировать атрибут "геом. размер" -- число, на основании которого принимать решение, отрисовывать ли объект при данном масштабе отображения карты. Индекс по етому параметру тоже. 5) Имея все вышеизложенное, научиться строить план отрисовки участка карты, в который попадают объекты, которые таки да, надо нарисовать, и попадают в том порядке, в каком они будут нарисованы. Согласен с вопросом №3,4,5 эти мысли у меня уже есть. Но вот меня больше волнует 1 вопрос. Вы Visitor предлагаете использовать БД. Но это не есть хорошо по быстродействию. Я когда год назад ознакамливался с этим вопросом, то вышел на материал в интернете SHAPE файлы. Эти файлы используются для отображения картографических данных, но там нет понятия слой, там только понятие местоположение объекта. И эти объекты все разной длинны. Расширение shp у файла и shx у индексного файла. Но писать компоненту для создание индексов для моего спецфайла? Оно того стоит, ведь если посмотреть на AutoCad или еще какие системы, там наверняка все сделано просто и со вкусом. Т.е. нужно как можно больше ускорить выборку из памяти объектов и отрисовку их с учетом слоев. |
Сообщ.
#8
,
|
|
|
Цитата Dimasn, 09.09.03, 12:57:26 Оно того стоит, ведь если посмотреть на AutoCad или еще какие системы, там наверняка все сделано просто и со вкусом. Анализируя файлы .dxf можно получить примерное представление о базе данных AutoCAD. Если до АС12 организация была сранительно простая, то AC2002 черт ногу сломит. Довольно простой визуализатор для .dxf (AC12 и реализованы не все функции) есть в кодах на Delphi -- Dxf_3_0, http://rcru1.te.rl.ac.uk/~jab/dxf. Взяв за основу организацию данных из этой программы, для собственных целей написал векторный редактор. Треугольная сетка с 50000- 100000 элементов (без закраски) выводится менше чем 1 с. (P3, 800 мГц, вывод средствами GUI) |
Сообщ.
#9
,
|
|
|
Цитата Dimasn, 09.09.03, 12:57:26 Т.е. нужно как можно больше ускорить выборку из памяти объектов и отрисовку их с учетом слоев. Мне (такое чисто субъективное ИМХО ) представляется, что вот ети пять пунктов уже серьезно оптимизируют алгоритм отображения карты. И писать в разы, а то и в десятки раз более сложный и объемный код ради того, чтобы на 20-30\% поднять производительность етого модуля программы -- (разводит руками)? А дальнейшую оптимизацию, вероятно, следует производить уже на уровне ограничений для объектов карты. Ограничений на протяженность, число вершин и т.п. Объекты разбивать на части... Здесь уже сходу ничего конкретного не скажешь -- надо думать, да и учитывать все задачи, которые должен решать проектируемый софт. А DXF и SHP -- ето форматы для хранения данных на диске. Насчет оптимальности их непосредственно для отрисовки карты -- ето еще вопрос. А вот импорт/экспорт в етот SHP, скорее всего, придется делать. |
Сообщ.
#10
,
|
|
|
Цитата Visitor, 09.09.03, 16:40:12 А DXF и SHP -- ето форматы для хранения данных на диске. Насчет оптимальности их непосредственно для отрисовки карты -- ето еще вопрос. А вот импорт/экспорт в етот SHP, скорее всего, придется делать. Да так оно и есть я использую свой формат SHP. И считываю его в TMemoryStream. А вот потом перебираю его и вывожу данные на экран. Конечно можно бы и DBF использовать для объектов, но скорость просто не будет. Я еще такое ограничение ввел: Считываются данные из файла и работаешь с ними в режиме просмотра неограниченное количество одновременных сеансов. А вот если редактировать, тогда монопольно, одновременно один сеанс. Этот файл будет блокирован для записи. Потом только сообщение о блокировке разработать о том кто заблокировал файл на редактирование. Но мне еще хотелось уточнить, вернуться к моему предположению. Сделать для каждого слоя свой буфер и считывать их по порядку 1 слой 1 буфер, затем второй слой второй буфер. Как Вы думаете повлечет ли это к быстродействию? |
Сообщ.
#11
,
|
|
|
Цитата Dimasn, 10.09.03, 06:50:35 Но мне еще хотелось уточнить, вернуться к моему предположению. Сделать для каждого слоя свой буфер и считывать их по порядку 1 слой 1 буфер, затем второй слой второй буфер. Как Вы думаете повлечет ли это к быстродействию? Честно, не могу сказать Да и никто не сможет. Надо набирать статистику на реальной карте. Если на карте объектов очень много, а отображается в среднем в каждом конкретной операции отрисовки только малая их часть, и при этом на само считывание объектов уходит много времени, то да, несомненно ускорит. Но не проще ли проходить по объектам без учета их слоя, и объекты, подлежащие отрисовке добавлять в один большой буфер, где они всегда хранятся отсортированными по слою? А потом этот буфер уже рисовать... А насчет того, что база данных не быстрее... Я бы сначала попробовал. БД ведь просто удобнее, т.к., не придется свой оптимизатор запросов писать, а ето задачка не из самых простых (можно читать так: из самых непростых ). |
Сообщ.
#12
,
|
|
|
Да это похоже на правду. Ладно буду пробовать, результат сообщу позже.
|
Сообщ.
#13
,
|
|
|
Попробуй ещё организовать все фигуры в связный список - по порядку прорисовки. Кажется, это достаточно простой вариант
|
Сообщ.
#14
,
|
|
|
Выбирай:
1. Сохранять в файл по слоям, т.е. сначала первый слой, потом второй и т.д. 2. Читать файл по слоям. Подумаешь, потормозит немного при загрузке файла. Зато потом будет быстро работать 3. При загрузке создать список записей из двух полей: а) номер слоя, б) ссылка на параметры объекта. Каждому объекту выделить по одной записи. Затем список отсортировать по номеру слоя. |
Сообщ.
#15
,
|
|
|
Цитата Jin X, 15.09.03, 20:53:32 Выбирай: 1. Сохранять в файл по слоям, т.е. сначала первый слой, потом второй и т.д. 2. Читать файл по слоям. Подумаешь, потормозит немного при загрузке файла. Зато потом будет быстро работать 3. При загрузке создать список записей из двух полей: а) номер слоя, б) ссылка на параметры объекта. Каждому объекту выделить по одной записи. Затем список отсортировать по номеру слоя. Первый пункт и второй пункт не имеет смысла, т.к. в мое карте будет, надеюсь, функции редактирования, и я не могу каждый раз пересортировывать слои. А вот третий пункт мне нравится. В описаниях shp рекомендовали использовать индексы, местоположение объекта от начала файла фигуры. У меня еще карта будет увязана с паспортами объектов, в базе данных. И для быстрого поиска всего скорей мне и понадобится идея из третьего пункта и при добавлении или удалении объектов. Еще при удалении или изменении объектов могут появиться дыры в буфере. Объект стал меньше по размеру или вообще удалили или вообще критичная ситуация стал больше, добавили в него точек. И таким образом модифицируемый объект удаляется (ему присваивается несуществующий номер слоя) и добавляется новый уже измененый объект. Карта будет прорисовываться в несколько проходов и начиная со слоя номер 1, т.е. слой номер 2 уже будет зарисовывать слой номер один. При выборке объектов из карты будут соблюдаться условия фильтра на выборку (принадлежность к слою, видимому диапазону и т.п.). Не знаю пока еще как это быстро все будет крутиться. Закончу писать класс, внедрю его в программу и тогда сообщу результат. Сейчас я прорабатываю класс, переписываю его уже раз 3 наверное. Структура его такова: Класс - Карта ============ 1.Структура слоев; 2.Буфер в котором хранятся объекты переменной длинны, т.е. разные фигуры. 3.Класс Фигура - в этом классе хранится текущий объект считанный из Буфера. 4. Процедуры и функции для работы с объектами карты. Удалить, добавить фигуру, считать карту из файла или записать, удалить фигуры из слоя, перенести фигуру (фигуры) из слоя в слой, импорт из DXF, спозиционироваться на первый объект, получит следующий объект и т.д. ... |