На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
Страницы: (2) [1] 2  все  ( Перейти к последнему сообщению )  
> Как создать "самодельный" AutoCad
    Привет Всем! Хотелось бы разобраться с тем как работает AutoCad, алгоритмы изнутри. Я создаю программу пока для себя, которая будет отображать карту города с коммуникациями. Дошел до этапа, когда нужно работать со слоями. Т.е. порядок отображения слоев. В формате моего спецфайла лежат фигуры-объекты разной длинны. У каждого объекта есть свойство - слой. Не знаю как быстро отрисовать слои. Т.е. например, рисуем слой границ кварталов или районов города, затем рисуем дома и дороги поверх слоя кварталов. В моем спецфайле фигуры лежат хаотично, т.е. в моем случае придется пробегать по спецфайлу и отрисовывать слои по порядку. Т.е. первый слой, второй слой и т.д. Что займет не одну секунду как у меня сейчас, а 5-6, может и более. Как отрисовка слоев происходит в автокаде, уж не с помощью ли "индексов". Тогда как их создать и корректировать во время добавления в карту объектов или удаления, или перемещения объектов из слоя в слой. Если есть у кого соображения по этому поводу, очень рад буду послушать.

    Заранее Спасибо.
      На самом деле, в АвтоКаде прорисовка НЕ ОБЯЗАТЕЛЬНО происходит по слоям.
        Цитата Faust, 08.09.03, 16:51:52
        На самом деле, в АвтоКаде прорисовка НЕ ОБЯЗАТЕЛЬНО происходит по слоям.

        Хорошо, я с AutoCad'ом не так хорошо знаком, мне главное принцип проработать прорисовки. В программе у меня будут закрашенные фигуры и просто фигуры без закраски. Так вот те фигуры, которые закрышенные они будут закрывать все те фигуры, которые находятся под "ними", т.к. нет порядка. Как внесли фигуры в спецфайл, так они и лежат. А я хочу, чтобы был порядок прорисовки.
        Представьте, у меня есть несколько нарисованных домов и фигура квартала. Дома это закрашенные фигуры, квартал тоже имеет свой цвет заливки. Теперь если в файле порядок фигур таков, что квартал рисуется после домов, согласно положению в файле, то он закроет, затрет все дома.
        Или все таки мне придется прорисовывать слои по порядку 1,2,... Но у меня в программе заложено 32 слоя, перебирать всю карту на предмет слоев 32 раза нерационально.
          Если работа идет со слоями.. то обязательно должнен быть фиксированный  порядок слоев, то есть для каждого слоя должен быть его своеобразный приоритет 0,1 и т.д. и от этого никуда не денешься, или же ипользовать что то типа Фотошоповского multiply, но при этом соответственно будет цветое искажение..
            Да. Вырисовывается совсем не быстродействующая картина. У меня выделяется под спецфайл кусок памяти. И из этого куска-буфера я считывать должен 32 раза, т.к. число слоев в карте именно столько и определено - железно.
            Есть еще мысля для каждого слоя создавать свой буфер, т.е.32 штуки буфера. И при прорисовке карты перебирать все не пустые буфера и выводить из них информацию на экран. Таким образом не будет перебора одних и тех же данных. Что несомненно повлечет к ускорению.
            Но все таки хотелось бы по системному, так сказать, подойти к этому вопросу. Как правильно это сделать?

            П.С. на сегодняшний день у меня прорисовывается карта города без коммуникаций и без наваротов (одним цветом и без закраски фигур, проволочная графика) всего за 1 сек. Но с увеличением функциональнгости это время станет больше, думаю секунд 5 и при скролинге будет не совсем удобно.
              Так навскидку я вижу тут такие 5 елементов задачи:

              1) Придумать структуру, позволяющую быстро находить данные по определенному набору критериев. Какая-нибудь БД с индексно-последовательным доступом: их туева хуча реализаций.
              2) Разделение объектов по слоям (кстати, а оно таки нужно 32 слоя? может меньше можно?). Индекс по слоям.
              3) С каждым объектом ассоциировать атрибут, эээ... назовем его "включающий многоугольник" :) (удобнее четырехугольник), для того, чтобы можно было быстро определить, попадает ли объект в отображаемую область карты. Индексы по левой, правой, верхней и нижней стороне етого прямоугольника.
              4) С каждым объектом ассоциировать атрибут "геом. размер" -- число, на основании которого принимать решение, отрисовывать ли объект при данном масштабе отображения карты. Индекс по етому параметру тоже.
              5) Имея все вышеизложенное, научиться строить план отрисовки участка карты, в который попадают объекты, которые таки да, надо нарисовать, и попадают в том порядке, в каком они будут нарисованы.
                Цитата Visitor, 09.09.03, 12:37:40
                Так навскидку я вижу тут такие 5 елементов задачи:

                1) Придумать структуру, позволяющую быстро находить данные по определенному набору критериев. Какая-нибудь БД с индексно-последовательным доступом: их туева хуча реализаций.
                2) Разделение объектов по слоям (кстати, а оно таки нужно 32 слоя? может меньше можно?). Индекс по слоям.
                3) С каждым объектом ассоциировать атрибут, эээ... назовем его "включающий многоугольник" :) (удобнее четырехугольник), для того, чтобы можно было быстро определить, попадает ли объект в отображаемую область карты. Индексы по левой, правой, верхней и нижней стороне етого прямоугольника.
                4) С каждым объектом ассоциировать атрибут "геом. размер" -- число, на основании которого принимать решение, отрисовывать ли объект при данном масштабе отображения карты. Индекс по етому параметру тоже.
                5) Имея все вышеизложенное, научиться строить план отрисовки участка карты, в который попадают объекты, которые таки да, надо нарисовать, и попадают в том порядке, в каком они будут нарисованы.


                Согласен с вопросом №3,4,5 эти мысли у меня уже есть. Но вот меня больше волнует 1 вопрос. Вы Visitor предлагаете использовать БД. Но это не есть хорошо по быстродействию. Я когда год назад ознакамливался с этим вопросом, то вышел на материал в интернете SHAPE файлы. Эти файлы используются для отображения картографических данных, но там нет понятия слой, там только понятие местоположение объекта. И эти объекты все разной длинны. Расширение shp у файла и  shx у индексного файла. Но писать компоненту для создание индексов для моего спецфайла? Оно того стоит, ведь если посмотреть на AutoCad или еще какие системы, там наверняка все сделано просто и со вкусом.

                Т.е. нужно как можно больше ускорить выборку из памяти объектов и отрисовку их с учетом слоев.
                  Цитата 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)
                    Цитата Dimasn, 09.09.03, 12:57:26

                    Т.е. нужно как можно больше ускорить выборку из памяти объектов и отрисовку их с учетом слоев.


                    Мне (такое чисто субъективное ИМХО :) ) представляется, что вот ети пять пунктов уже серьезно оптимизируют алгоритм отображения карты. И писать в разы, а то и в десятки раз более сложный и объемный код ради того, чтобы на 20-30\% поднять производительность етого модуля программы -- (разводит руками)?

                    А дальнейшую оптимизацию, вероятно, следует производить уже на уровне ограничений для объектов карты. Ограничений на протяженность, число вершин и т.п. Объекты разбивать на части... Здесь уже сходу ничего конкретного не скажешь -- надо думать, да и учитывать все задачи, которые должен решать проектируемый софт.

                    А DXF и SHP -- ето форматы для хранения данных на диске. Насчет оптимальности их  непосредственно для отрисовки карты -- ето еще вопрос. А вот импорт/экспорт в етот SHP, скорее всего, придется делать. :)
                      Цитата Visitor, 09.09.03, 16:40:12


                      А DXF и SHP -- ето форматы для хранения данных на диске. Насчет оптимальности их  непосредственно для отрисовки карты -- ето еще вопрос. А вот импорт/экспорт в етот SHP, скорее всего, придется делать. :)


                      Да так оно и есть я использую свой формат SHP. И считываю его в TMemoryStream. А вот потом перебираю его и вывожу данные на экран.
                      Конечно можно бы и DBF использовать для объектов, но скорость просто не будет. Я еще такое ограничение ввел: Считываются данные из файла и работаешь с ними в режиме просмотра неограниченное количество одновременных сеансов. А вот если редактировать, тогда монопольно, одновременно один сеанс. Этот файл будет блокирован для записи. Потом только сообщение о блокировке разработать о том кто заблокировал файл на редактирование.

                      Но мне еще хотелось уточнить, вернуться к моему предположению. Сделать для каждого слоя свой буфер и считывать их по порядку 1 слой 1 буфер, затем второй слой второй буфер. Как Вы думаете повлечет ли это к быстродействию?
                      Сообщение отредактировано: Dimasn -
                        Цитата Dimasn, 10.09.03, 06:50:35

                        Но мне еще хотелось уточнить, вернуться к моему предположению. Сделать для каждого слоя свой буфер и считывать их по порядку 1 слой 1 буфер, затем второй слой второй буфер. Как Вы думаете повлечет ли это к быстродействию?


                        Честно, не могу сказать :) Да и никто не сможет. Надо набирать статистику на реальной карте. Если на карте объектов очень много, а отображается в среднем в каждом конкретной операции отрисовки только малая их часть, и при этом на само считывание объектов уходит много времени, то да, несомненно ускорит.

                        Но не проще ли проходить по объектам без учета их слоя, и объекты, подлежащие отрисовке добавлять в один большой буфер, где они всегда хранятся отсортированными по слою? А потом этот буфер уже рисовать...

                        А насчет того, что база данных не быстрее... Я бы сначала попробовал. БД ведь просто удобнее, т.к., не придется свой оптимизатор запросов писать, а ето задачка не из самых простых (можно читать так: из самых непростых :) ).
                        Сообщение отредактировано: Visitor -
                          Да это похоже на правду. Ладно буду пробовать, результат сообщу позже.
                            Попробуй ещё организовать все фигуры в связный список - по порядку прорисовки. Кажется, это достаточно простой вариант
                              Выбирай:
                              1. Сохранять в файл по слоям, т.е. сначала первый слой, потом второй и т.д.
                              2. Читать файл по слоям. Подумаешь, потормозит немного при загрузке файла. Зато потом будет быстро работать :)
                              3. При загрузке создать список записей из двух полей: а) номер слоя, б) ссылка на параметры объекта. Каждому объекту выделить по одной записи. Затем список отсортировать по номеру слоя.
                              Сообщение отредактировано: 7in -
                                Цитата Jin X, 15.09.03, 20:53:32
                                Выбирай:
                                1. Сохранять в файл по слоям, т.е. сначала первый слой, потом второй и т.д.
                                2. Читать файл по слоям. Подумаешь, потормозит немного при загрузке файла. Зато потом будет быстро работать :)
                                3. При загрузке создать список записей из двух полей: а) номер слоя, б) ссылка на параметры объекта. Каждому объекту выделить по одной записи. Затем список отсортировать по номеру слоя.


                                Первый пункт и второй пункт не имеет смысла, т.к. в мое карте будет, надеюсь, функции редактирования, и я не могу каждый раз пересортировывать слои.

                                А вот третий пункт мне нравится. В описаниях shp рекомендовали использовать индексы, местоположение объекта от начала файла фигуры. У меня еще карта будет увязана с паспортами объектов, в базе данных. И для быстрого поиска всего скорей мне и понадобится идея из третьего пункта и при добавлении или удалении объектов.

                                Еще при удалении или изменении объектов могут появиться дыры в буфере. Объект стал меньше по размеру или вообще удалили или вообще критичная ситуация стал больше, добавили в него точек. И таким образом модифицируемый объект удаляется (ему присваивается несуществующий номер слоя) и добавляется новый уже измененый объект. Карта будет прорисовываться в несколько проходов и начиная со слоя номер 1, т.е. слой номер 2 уже будет зарисовывать слой номер один. При выборке объектов из карты будут соблюдаться условия фильтра на выборку (принадлежность к слою, видимому диапазону и т.п.). Не знаю пока еще как это быстро все будет крутиться. Закончу писать класс, внедрю его в программу и тогда сообщу результат.

                                Сейчас я прорабатываю класс, переписываю его уже раз 3 наверное. Структура его такова:

                                Класс - Карта
                                ============
                                1.Структура слоев;
                                2.Буфер в котором хранятся объекты переменной длинны, т.е. разные фигуры.
                                3.Класс Фигура - в этом классе хранится текущий объект считанный из Буфера.
                                4. Процедуры и функции для работы с объектами карты. Удалить, добавить фигуру, считать карту из файла или записать, удалить фигуры из слоя, перенести фигуру (фигуры) из слоя в слой, импорт из DXF, спозиционироваться на первый объект, получит следующий объект и т.д. ...
                                Сообщение отредактировано: Dimasn -
                                1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0413 ]   [ 14 queries used ]   [ Generated: 19.05.24, 17:06 GMT ]