|
||
| Правила | Регистрация | Пользователи | Сообщения за день | | Поиск | | Справка по форуму | Файлообменник | |
|
![]() |
Поиск в этой теме |
![]() |
#1 | |
Оптимизация обработки большого числа элементов
топограф, технолог
Москва
Регистрация: 24.05.2009
Сообщений: 3,075
|
||
Просмотров: 47617
|
|
||||
Регистрация: 18.12.2010
Сообщений: 5,115
|
|
|||
![]() |
|
||||
Ты можешь итеративно перебрать все элементы базы данных чертежа, получив все ObjectId и попутно (если нужно) группируя результаты по своему усмотрению (всё зависит от твоего алгоритма обработки). Например, итерация чертежа, размером 50Мб, с выборкой всех ObjectId и их группировкой по типам примитивов у меня заняло меньше секунды.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Цитата:
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Цитата:
Цитата:
Цитата:
Я надеялся, что опытные программисты поделятся проверенными, отработанными, более-менее универсальными подходами. Наверняка же такие есть. Пусть их будет не один, а два-три-четыре, чтобы выбрать подходящий под ту или иную частную задачу. Еще подвопрос: что делается быстрее - получение габаритов элементов или списков их вершин? Габариты получают каким-то специальным методом или как раз просмотром координат вершин? |
||||
![]() |
|
||||
|
||||
![]() |
|
||||
Регистрация: 18.12.2010
Сообщений: 5,115
|
Цитата:
Читать: Ф. Препарата, М. Шеймос - Вычислительная Геометрия: Введение Майкл Ласло - Вычислительная геометрия и компьютерная графика на C++ И все они реализованы в "Пространственных базах данных" - бери и пользуйся, самые лучшие ;=) |
|||
![]() |
|
||||
|
||||
![]() |
|
||||
Цитата:
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |
|
||||
Цитата:
Если я правильно понял Вашу ссылку, то там речь идет об оптимизации обработки свойств элементов, например, текстовых стилей (сужу по "Пример целесообразного использования"). |
||||
![]() |
|
||||
Цитата:
Я допускаю, что в разных языках одни и те же действия с данными могут быть лучше-хуже обеспечены. Но здесь мне бы хотелось обсуждать больше алгоритмы, чем программистские приемы. |
||||
![]() |
|
||||
Нет, это просто элементарный пример на произвольную тему. Основная идея в том, чтобы быстро получать идентификаторы нужных объектов (на основе любых фильтров, соответствующих задаче), затем на основе этих идентификаторов получать сами объекты и выполнять любую их модификацию (при необходимости). В качестве условия фильтрации можно передать любое выражение, возвращающее логическое значение. В качестве операции можно передать любой метод, соответствующий обозначенной в интерфейсе сигнатуре.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |
|
||||
Offtop: ...да, похоже, до обсуждения самих алгоритмов мы не доберемся. Видно, шибко они секретные. Или наоборот.
Цитата:
|
||||
![]() |
|
||||
Это, как минимум, формирует наборы данных в удобной вам форме для их дальнейшей обработки в коде вашего алгоритма.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |
|
||||
Конкретная задача - это же и будет абстрактно.
Чем не задачи, которые я привел в первом сообщении и в "т.п."? Мы сейчас пишем почти одновременно примерно семь подобных программ, и во всех делается фактически одно - многократный перебор всех элементов с установлением их взаимного положения, отношений и связей. И такого же рода программ придется писать еще несколько и в ближайшее время, и, похоже, позже. Цитата:
Вероятно, просмотр всех элементов неизбежен, и в этом Ваше решение может быть очень полезным. Но это только подход к задаче. Как бы в процессе этого просмотра элементов создать такое описание их положения и формы, чтобы при последующем анализе просматривать уже не все, а в основном потенциально необходимые элементы? |
||||
![]() |
|
||||
Цитата:
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>Как непосвещенный, я предполагаю, что в dwg-файле элементы хранятся в целом просто в порядке их поступления,т.е. их взаимные связи (соединение, наложение, пересечение и т.п.) никак не описаны, и их взаимное положение никак не структурировано, не описано. Это правильно?
Нет, не правильно. При обработке примитивов автокад вовсю использует пространственное разбиение >>для файлов примерно какого размера (+-полмегабайта) или какого числа элементов (+-1000), или числа вершин элементов (+-1000) подобные ухищрения имеют смысл на не очень мощных и на хороших компьютерах? Эмпирически-экспертно, конечно. Всякого рода "ухищрения" имеют смысл всегда, иначе программа будет тормозить на любом компьютере |
|||
![]() |
|
||||
Цитата:
![]() Можно узнать какое, в чем оно выражается? И как им лучше воспользоваться? |
||||
![]() |
|
||||
Похоже мы на разных языках разговариваем... Обозначенный мною выше код позволяет манипулировать данными, имеющими свой ObjectId, создавая наборы элементов, подлежащих обработке и, при необходимости, модифицируя их. Код писался не для некой "геометрическую оптимизации", а для более общих задач. Я не знаю как ещё объяснять - вроде там всё должно быть понятно из кода, т.к. постарался там разжевать всё как можно подробней, насколько это возможно.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>Можно узнать какое, в чем оно выражается?
Выражается в скорости работы, недостижимой при подходе "я предполагаю, что в dwg-файле элементы хранятся в целом просто в порядке их поступления,т.е.". Т.е. в dwg файле они так и хранятся (хотя там присутствуют некие SPATIAL_FILTER, SPATIAL_INDEX - не вникал что они в себе несут), но обрабатывается всё это хозяйство явно не "всё по очереди" >>И как им лучше воспользоваться? Это вопрос к местным корифеям, какие свои механизмы автокад предоставляет наружу. В порядке ознакомления что это и зачем лучше заглянуть в википедию и почиать про http://en.wikipedia.org/wiki/K-d_tree и подобные алгоритмы |
|||
![]() |
|
||||
Цитата:
Цитата:
|
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>Т.е. сама фирма некую оптимизацию использует, но какую - неизвестно? И Вы считаете, что в самих dwg файлах есть что-то вроде индексации или т.п., но что именно - тоже неизвестно?
Неизвестно мне и вам. Я же говорю, пусть знатоки выскажутся - что на эту тему можно выудить из arx - вполне возможно что ничего, но это не значит что не использует. Говоря про dwg файл я подразумеваю файл лежащий на диске, а не dwg открытый автокадом. |
|||
![]() |
|
||||
Цитата:
Расколюсь. В пятницу, 13-го, в конце рабочего дня породил некий алгоритмище оптимизации (ну, сами понимаете, что может придумать 13-го в пятницу вечером не программист ![]() Но попробую приложить - для некоего примера того, что я имею в виду. Последний раз редактировалось АлексЮстасу, 16.09.2013 в 04:35. |
||||
![]() |
|
||||
Цитата:
Почему именно этот метод? Чем этот метод лучше других? Вы полагаете, что этот метод не только лучший, но еще и хорошо реализуется программно? Вам известны примеры его применения в каких-то программах под Автокад? Кстати, в #27 zamtmn привел в пример именно K-d_tree. Последний раз редактировалось АлексЮстасу, 16.09.2013 в 04:39. |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
trir
Придумывать, а потом читать книжки реально интересней)) АлексЮстасу Добавте в алгоритм пару пунктов: -Лучше ввести древовидную структуру данных, т.к. 1)еще больший профит за счет отбраковки всех дочерних "подпространств" путем отбраковки вышестоящего, 2) реальные а не подготовленные данные наврятли можно вписать в какую либо "сетку" - всегда будут примитивы которые будут всё портить - пересекать границы в которые хорошо вписываются другие примитивы, 3) удобно "ограничить" процесс построения такого дерева количеством примитивов в "листах" и глубиной вложенности -В случае наличия в данных "длинных" примитивов - например полилиний с большим кол-вом сегментов ваш алгоритм стоит применять и внутри примитивов (т.е. грубо говоря считать полилинию набором отрезков и дуг) update: Цитата:
update2: когда я вникал в потроха LibreCAD он был еще 1.0, сейчас уже 2.0rc, такчто возможно он уже поумнел и не "в лоб" Последний раз редактировалось zamtmn, 16.09.2013 в 08:18. |
|||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
Если автокад не предоставляет подобных "интерфейсов" то дерево садить придется только перед проведением массивных геометрических вычислений, после рубить на дрова. Хотя уверенн что все элементарные операции (типа поиска пересечений или примитивов в окресности) в автокаде подобным образом и устроены и только ради них такое городить нестоит
Последний раз редактировалось zamtmn, 16.09.2013 в 08:19. |
|||
![]() |
|
||||
Цитата:
Т.е. этот алгоритм следует понимать не совсем буквально, а как некий эскиз для предложений. Алгоритм предназначен для работы самой программы, его описание данных живет только в процессе выполнения программ - и никак не влияет на сами данные, на их структурирование в файле. Поэтому и изменение данных ("приклеивание листьев", веток и пр. к чертежу) не влияет на него. Цитата:
Габарит сетки >= габариту файла. Цитата:
И да, мне уже говорят, что в Автокаде все устроено через такие гланды, что проще прямо перебирать элементы, чем еще и грузить его (и себя) оптимизацией. ![]() |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>Поясните, плз, пункт 2).
Для примера файл из 10 полилиний по 10000 сегментов в каждой. Построение дерева на уровне примитивов в таком случае эффекта иметь не будет. Если же для каждой полилинии выполнить разбиение (отдельно или в общей структуре данных) эффект появится - т.к. перебор 10000 сегментов заменится двоичным поиском. >>Все потому же - не могу оценить трудоемкость (вредоносность/эффективность). на коленке написаный алгоритм разбиения на паскале занял ~500 строк. эффект получился значительный - в программе-тормозилке стало возможно вполне комфортно работать. Но были большие сложности подружить его с уже работающими фрагментами. построение дерева для 21000 примитивов, 500 примитивов в ноде, максимальная глубина берева 16: Цитата:
Цитата:
|
|||
![]() |
|
||||
|
||||
![]() |
|
||||
Node (узел). Уже сто раз можно было в интернете самостоятельно найти и прочитать информацию по теме построения деревьев...
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
Я не програмист поэтому извиняюсь если путаю термины. Также это всё хозяйство было написано без оглядки на толковые книжки - я их читал когдато давно в детстве.
Нода в моей реализации - ограничивающий объем+плоскость делящая ноду+ссылка на ноду "левее" плоскости+ссылка на ноду "правее" плоскости+список примитивов которые пересекаются плоскостью 1.На вход приходит срисок примитивов+уже посчитаный ограничивающий объем всех примитивов 2.создаем ноду 3.если (примитивов<примитивов в ноде)или(глубина дерева>максимальная глубина берева) то пишем все примитивы в список пересекающихся плоскостью, выходим возвращая созданную ноду 3.выбираем плоскость разбиения (тут я прибумывал всякие хитрые способы, но просто разбивать пополам перпендикулярно самой длинной оси ничють не хуже всяких хитростей) 4.список примитивов делим на 3 списка 1-левее плоскости, 2-правее плоскости, 3-пересекаются плоскостью 5. пишем список 3 в список пересекающихся плоскостью 6. ссылка на ноду "левее" плоскости=рекурсивный вызов п.1 со списком 1 и его ограничивающим объемом 7. ссылка на ноду "правее" плоскости=рекурсивный вызов п.1 со списком 2 и его ограничивающим объемом на выходе получается рекурсивное дерево ограничивающих объемов с перечнем примитивов в него попавших. разбиение продолжается пока не будет достигнута максимальная глубина или количество примитивов в ноде не будет меньше заданного Цитата:
ps. На оптимальность алгоритма я не претендую Последний раз редактировалось zamtmn, 16.09.2013 в 21:25. |
|||
![]() |
|
||||
"Плоскость", "объем" - у Вас анализ 3D или это просто такие термины?
|
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
Алгоритм работает одинакво и для 3Д и для 2Д. но нужно либо учесть вырождение объема\плоскости в прямоугольник\прямую, либо в случае "плоского" ограничивающего объема дать ему минимальную разбежку по нулевой оси (т.е. сделать совсем чуть чуть неплоским)
Я использую второй вариант, по "плоской" оси разбиение производится небудет, т.к. она всегда будет минимальной |
|||
![]() |
|
||||
Цитата:
Пока перевариваю......... Могу предложить тем, кому желательны примеры, задачу: находить (создавать) для всего набора линейных элементов все возможные минимальные замкнутые контуры. Контуры точные, полные и все - в отличие от фирменной BOUNDARY, которая к тому же только штучная. Задача вполне реальное решение имеет. Например, FlashPolygons от Delicad. Offtop: Правда, попробовал сегодня свежезагруженную версию FlashPolygons, и такое ощущение, что они что-то так улучшили, что она еле телепается. Опробовал ее в 2010 на файлах с десятками тысяч элементов, и она строила все контуры считанные секунды. А компьютер был послабее, и был XP. Видимо, они ее оптимизировали ![]() Предполагаю, что в этой задаче процедуры только самые простые: найти все пересечения всех элементов, и на их основе собрать все замкнутые минимальные контуры. Элементы и их части после разбивания на пересечениях, чьи начальные-конечные точки ни к чему не примыкают, игнорируются. Для упрощения сплайны,трехмерные элементы не рассматриваем. Исходные элементы сохраняются в их исходном состоянии. Допустим, добиваемся, чтобы результат получался на 2-3 десятках тысяч элементов из десятков и сотен сегментов каждый за, максимум, 5-7 секунд. |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>Делящие плоскости вертикальные? По осям XZ, YZ?
да (еще XY для 3Д случая), ограничвающий объем тоже "выровнен" по осям - т.н. AABB (Axis-Aligned Bounding Box) При этом ограничивающий объем "левого" и "правого" списка можно почесному пересчитать, а можно рассеч плоскостью исходный. Я не пересчитываю, при этом "хватается" лишнее пустое пространство, но для "среднестатистического" чертежа это ИМХО не критично. критично для очень "разряженного" чертежа Поиск пересечений я сегодня организую, если будет свободная минута, для самого элементарного случая - чертеж из N линий. Из спортивного интереса - посмотреть как влияют параметры "дерева" на время нахождения всех пересечений. А вот искать контуры (насколько понимаю это возня с графами) на данный момент мне не интересно и не по зубам)) update: В #37 забыл упомянуть циферки про расход памяти под всё это дело: чертеж тотже, 21250 примитивов, x86_64 сборка для случая с 500 примитивов в ноде выделено памяти под списки примитивов в нодах: 223912 байт выделено памяти под сами ноды: 22042 байт для случая с 10 примитивов в ноде выделено памяти под списки примитивов в нодах: 223912 байт выделено памяти под сами ноды: 702460 байт Странно что количество под списки не меняется, вроде должно увеличиться. Может глючу в замерах, а может связано с тем что колво примитивов не изменилось и как их не раскладывай по разным спискам - в сумме будет одно и тоже Последний раз редактировалось zamtmn, 17.09.2013 в 09:32. |
|||
![]() |
|
||||
Цитата:
|
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
Вроде сделал поиск пересечений, особо не проверял, но с виду работает правильно, даже если и пропускает несколько пересечений, то на общую картину это не влияет - для замера времени пойдет
Для теста соорудил 2 файла, скриншоты с визуализацией сетки (серым сетка, красным - линии) разбиения прилагаю (для случая с 10 примитивами в ноде) regular.dxf - представляет собой регулярную сетку из крестов образованных 2мя короткими линиями, всего 20000 линий, 10000 пересечений. Это идеальный случай - он отлично пространственно разбивается nonregular.dxf - мешанина из 20000 случайных линий сопоставимых по размерам с габаритами чертежа, кол-во пересечений 11559108. Наихудший случай - в разбивку попадает очень мало линий, они слишком длинные и "кучные" тест прилагаю в виде лога последовательного выполнения 2х команд разделенных "-------------------------------------" для разных условий первая RebuildTree строит "дерево" вторая FindAllIntersections собственно ищет пересечения тест проводил для разбиений до 10,100,1000,10000 примитивов в "ноде" (Max in node entities), последний случай (100000) представляет собой фактическое отсутствие разбиения, все примитивы находятся в корневой "ноде", никакого разбития нет пояснения для вывода команд: Цитата:
Цитата:
Цитата:
|
|||
![]() |
|
||||
Приложите nonregular.dxf здесь или во всем доступное место.
Чтобы использовать как тестовый для разных методов и программ. И на компьютере с какими характеристиками это делалось? Еще интересно посмотреть, как оптимизация влияет на работу программ на небольших файлах. Допустим, элементов на 1000. Последний раз редактировалось АлексЮстасу, 17.09.2013 в 18:55. |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>Чтобы использовать как тестовый для разных методов и программ.
Приложил. Я его взял как наихудший из возможных, в реальности так плох небывает. Для тестов нужно чтото реальнеое. >>И на компьютере с какими характеристиками это делалось? i5-2400, 8Gb, Kubuntu 13.04, x86_64 >>Еще интересно посмотреть, как оптимизация влияет на работу программ на небольших файлах. Допустим, элементов на 1000. Давайте файл, посмотрю |
|||
![]() |
|
||||
|
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
мешанину из 1000 примитивов нужно на компе послабже тестить
файл приложен - 1172 линии, 22067 пересечения, картинка для "разбиения" "по 10" приложена. лог для случаев 10, 100, 1000, 2000(без разбиения) Цитата:
upd: было бы интересно услышать результаты для приложенных файлов полученные штатными ARX средствами на сопоставимом компьютере Последний раз редактировалось zamtmn, 17.09.2013 в 20:51. |
|||
![]() |
|
||||
Вы делаете пересечения, т.е. разбиваете элементы или только их находите?
Дело в том, что просто поиском пересечений никакие готовые программы не занимаются. Их находят, и что-то с ними делают - разбивают элементы в них, вставляют что-то и пр. Т.е. время затрачивается еще и на это. Если Вы их только находите, то сравнивать скорости программ невозможно. |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
Только нахожу пересечения и получаю информацию какая линия где пересекается, т.е. грубо говоря в каких точках каждую линию нужно резать. Порезат по этой информации линии или вставить туда чтото в принципе несложно, но это другая тема - тут геометрическая оптимизация непоможет
|
|||
![]() |
|
||||
Цитата:
Цитата:
![]() Запустил этот файл на разбиение в пересечениях штатным инструментом Autocad Map 3D - Drawing cleanup-Break intersections. На неплохой машине, и машине немного похуже. Оба раза прождал минут сорок-пятьдесят - так и закрывал Автокад, не дождавшись. Запустил здешней лисп-программой от VVA - BreakObjects22а. Результат такой же - тоже закрыл Автокад прерыванием работы через час молотьбы. Пока что получается, что Ваша программа и без всякой оптимизации работает с однозначно фантастической скоростью. Либо Автокад тормозит на собственно разбивании, на создании новых элементов. В этих файлах у элементов отрицательные координаты. Если меньший чертеж передвинуть в положительные координаты, то Drawing cleanup-Break intersections сделала все пересечения примерно за 8 секунд. А лисп BreakObjects22а по-прежнему не может завершить обработку. На большем чертеже и Drawing cleanup-Break intersections тоже не может закончить. Как-то непонятно... Тем более, что файлы я перед этим полечил, почистил, перекопировал содержимое в новый файл на основе штатного шаблона. Последний раз редактировалось АлексЮстасу, 18.09.2013 в 05:12. |
||||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
АлексЮстасу, не путай нахождение пересечений и выполнений операций с примитивами. Первое может занимать во много раз меньше времени, чем второе.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
Приделал установку примитива "точка" в найденных точках пересечения, в выводе появился параметр Placing points - соответственно время затраченное на расстановку точек.
Результат для regular.dxf: Цитата:
Цитата:
|
|||
![]() |
|
||||
Регистрация: 18.12.2010
Сообщений: 5,115
|
"Процесс автоматически грохается сторожем памяти на этапе расстановки точек" - поэтому я и говорю, что надо использовать Пространственную БД.
1. Пространственный индекс - то же дерево или лучше 2. SQL позволяет выполнять выборку нужных объектов 3. Сервер БД сам заморачивается с памятью Нефиг изобретать велосипед, когда есть готовое решение... |
|||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>Нефиг изобретать велосипед, когда есть готовое решение...
Я неспорю что это всё есть, но пожалуйста озвучте циферки результатов. Иначе это не готовое решение а "чтото там есть" и "вроде как для этого и задумывалось". Свои поделки я никому не навязываю как готовое решение, просто мне это интересно. update: Приделал резалку по точкам пересечения. результаты для nonregular2.dxf с коментариями к новым параметрам: Цитата:
Последний раз редактировалось zamtmn, 18.09.2013 в 15:37. |
|||
![]() |
|
||||
Такие чисто геометрические процессы, как разбивать пересечения, создавать контуры, находить попавшее в контуры и пр. больше всего нужны для первичной подготовки данных. Еще сугубо графических - линий, блоков, текстов и пр. В том числе для сбора и подготовки сырья для наполнения пространственных БД. Которую технологично делать в голых CADах или в них же, но дополненных для подготовки данных для этих пространственных БД. В такие БД нельзя же загружать неподготовленное соответствующим образом сырье - без топологической коррекции и пр. Поэтому программки типа разбивания пересечений и пр. нужны в первую очередь еще на уровне собственно CADов.
Против возможностей самих пространственных БД совершенно ничего не имею! Прямо наоборот. Все, кто просил примеры и конкретные задачи, куда-то испарились ![]() У Вас там в сумме и полсекунды не набирается. Время на отрисовку на экране как-то влияет? Или Вы обрабатываете не загруженные файлы? На чем у Вас написано? В целом же как-то несравнимо у Вас все быстро и без оптимизаций. ![]() |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
Функция разбиения сырая, но не неоптимизированная. Там отсутствуют проверки на всякие закрытые слои, обрабатывается вся модель, а не выбранные примитивы... и прочие "мелочи". Поиск пересечений оптимизировать наврятли получится, разве что обнаружится какойнибудь глобальный косяк в алгоритме. Время создания-изменения примитивов возрастет раза в полтора-два после заворачивания в undo\redo. Наверно можно будет выиграть несколько процентов "подтасовывая" данные приготавливаемые к последующей нарезке - но кординально оптимизировать там нечего
Написано на паскале, в виде команды для самодельной кад программы, тоже написанной на паскале. Обрабатывается загруженный файл, во время обработки никаких отрисовок не происходит, программа "повисает" на время выполнения команды. |
|||
![]() |
|
||||
|
||||
![]() |
|
||||
|
||||
![]() |
|
||||
Цитата:
Цитата:
Теперь насчёт этого: Это звездёж и вот тому подтверждение. Результаты обозначены на .NET, а ARX будет даже побыстрее (хоть и не намного). Как видим в файле, объёмом 51Мб на то, чтобы в итерации перебрать 736 323 примитива, уходит 0,278 сек. А теперь разделите 0,278 на 736,323 и узнаете, за какое время просмотрено 1000 элементов: 0,000378 сек.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: Последний раз редактировалось hwd, 18.09.2013 в 21:19. |
||||
![]() |
|
||||
|
||||
![]() |
|
||||
Но если делать через ж@пу, то эти же данные можно перебирать и целых 5 мин 36 сек.
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
hwd
Цитаты все попутаны >>Говорят кур доят... Это с каких пор AutoLISP\Visual Lisp стал быстрее, чем C++ или .NET?. очень сомнительно - значит я сомневаюсь что ARX не осилит такой элементарщины. И что имхо он гораздо быстрее. Но точно сказать немогу - не в зуб ногой в нем |
|||
![]() |
|
||||
Спасибо, исправил.
Цитата:
Цитата:
Цитата:
__________________
Надеюсь, ты не социальный овощ? Это определяется делами! :welcome: Последний раз редактировалось hwd, 18.09.2013 в 21:32. |
||||
![]() |
|
||||
КЖ; C# Регистрация: 03.11.2005
Санкт-Петербург
Сообщений: 2,616
|
|
|||
![]() |
|
||||
Цитата:
И до #60 пытался сконцентрировать внимание на основном вопросе темы. Но в первую очередь о том, что хорошие идеи находят признание. ![]() Запрашиваемый пример задачи выложен в #43. Сейчас он пока сузился до создания пересечений. Тестовые файлы: большой в #48 и меньший в #50. Есть ли шанс получить в Автокаде скорость обработки, сравнимую с результатами zamtmn? Пока что получены только отрицательные результаты обработки лисп-программой BreakObjects и фирменной Break Intersections от Autocad Map 3D - не могут они обработать больший файл вообще, а меньший наполовину. От тех же, кто просил примеры задачи, результатов не поступило ![]() Последний раз редактировалось АлексЮстасу, 19.09.2013 в 02:59. |
||||
![]() |
|
||||
Регистрация: 18.12.2010
Сообщений: 5,115
|
regular.dxf
Цитата:
Последний раз редактировалось trir, 19.09.2013 в 04:12. |
|||
![]() |
|
||||
|
||||
![]() |
|
||||
строю, ломаю Регистрация: 03.04.2008
Украина
Сообщений: 5,515
|
http://forum.dwg.ru/showpost.php?p=1152361&postcount=89
В автокаде программа работала в течение часа |
|||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
Понятно, а какие нибудь подробности о типе индекса известны или "черный ящик"? Если распологаешь свободным временем, сделай пожалуйста тоже для nonregular и nonregular2 - очень интересует сравнение результатов для легко и трудноиндексируемых данных
|
|||
![]() |
|
||||
Регистрация: 18.12.2010
Сообщений: 5,115
|
|
|||
![]() |
|
||||
Есть ли у нас шанс увидеть цифры для создания пересечений с использованием этого способа?
|
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
trir
Переодически подумываю переделать бинарное дерево в R, но чето напрягает то что объемы могут пересекаться - неоднозначно както - будут трудности с быстрой перестройкой при изменении части чертежа. В бинарном все просто - примитив сдвинули, вышел за пределы объема - переношу его на уровень выше и так пока не окажется в объеме. Если какаято нода оказывается переполненной, то перестройка касается только ее и дочерние ноды. В R всё сложнее - всё перестраивать придется чаще чем бинарное. АлексЮстасу В продолжение темы. Я для наглядности чуток переделал процедуру постройки дерева, чтоб выудить побольше информации о структуре Резльтаты для regular.dxf с пояснениями: Код:
Код:
|
|||
![]() |
|
||||
Цитата:
И еще немного все-таки вопросов от малопосвещенного и неопытного: 1. Вхождение примитивов в объем или пересечение с режущими плоскостями рассматривается по всем вершинам примитивов или по их габаритам? 2. Как хранятся описания самих узлов (объемов)? 3. Один и тот же примитив может входить во множество объемов разного уровня? 4. В первом, верхнем узле хранятся все элементы? 5. На нижнем уровне каждый примитив входит только в один узел? (Пересекаемые плоскостями не в счет). 6. Пересекаемые плоскостями примитивы описываются только один раз - в том узле, в котором они первый раз были пересечены? |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>Интересно, сколько времени занимает получение списка примитивов?
Максимально быстрое, т.к. внутри программы имеется прямой доступ ко всем структурам данных по указателям (а не по идентификаторам как в примере hwd). в том числе к спискам примитивов и самим примитивам - это положительно сказывается на скорости, но требует аккуратности - чуть что не так - вылет 1. На этапе аостройки "дерева" работа осуществляется только с габаритами примитивов, что из себя представляет примитив - безразницы 2. AABB описаны в виде 2х точек - левая-нижняя-ближняя и правая-верхняя-дальняя - диагональные точки ограничивающего объема 3. Примитив может находится только в одной "ноде" 4. Нет только те объем которых пересекся плоскостью и соответсвенно их невышло "разбить двльше" 5. "Пересекаемые плоскостями не в счет" я неверно сразу выразился - пересекаемый - значит он остается в этой нооде. и соответственно "список пересекаемых" это и есть примитивы лежащие в этой ноде 6. да. см п.3 и п.5 update: Сейчас глянул исходники, у меня там еще некоторые "оптимизации" присутствуют: - точка по по которой объем рассекается полскостью - выбирается как центр габаритов всех примитивов - проводится расчет для всех 3 возможных плоскостей и выбирается оптимальная - (меньше всего примитивов в ноде и примерно равное разбиение для списков "слева" и "справа") На эти процедуры тратится значительное время (т.к. требуется перебор всех примитивов), а толку от них не много - разбиение почти не отличается от простого рассекания пополам длинной стороты объема Если придумаете какойнить легкий способ выбора оптимальной плоскости - дайте знать Последний раз редактировалось zamtmn, 22.09.2013 в 21:04. |
|||
![]() |
|
||||
Т.е., чтобы найти все ближайшие примитивы рядом с какой-нибудь точкой, нужно найти соответствующий узел (или узлы) нижнего уровня, примитивы в нем, а потом все примитивы, пересеченные плоскостями всех соответствующих старших узлов?
|
||||
![]() |
|
||||
В теме написано аж на пять страниц, а сухой остаток что-то жидковат
![]() 1. Узнали, что пространственные базы данных (не Автокад) используют оптимизацию. Даже узнали, что в каком-то случае это R-дерево. И получили рекомендацию использовать k-d tree. 2. Узнали, что можно очень эффективно оптимизировать считывание, просмотр огромного числа примитивов. С помощью .NET (реализовано), и, возможно, ARX (не испробовано). 3. Узнали, что в самодельном CAD, работающем с dxf-файлами, можно писать на Паскале чрезвычайно эффективные программы обработки данных. В том числе мы узнали подробности реализованного для этого CAD оригинального алгоритма оптимизации деревом собственной конструкции. 4. Узнали, что имеющиеся программы (создания пересечений) под Автокад могут вообще не обрабатывать тяжелые файлы. Не узнали ни об одной реализации под Автокад оптимизации обработки геометрических отношений данных. Не произошло обсуждения предложенных алгоритмов обработки геометрических отношений данных. Если не считать моих глупых вопросов и законного ответа zamtmn, что древовидные структуры - признанный метод оптимизации. Итого: исходный вопрос об оптимизации обработки геометрических отношений элементов файлов в Автокаде фактически не обсуждался. Все-таки что-нибудь скажете про мой алгоритм оптимизации регулярным разделением файла? Цитата:
Цитата:
2. Регулярное разбиение обладает возможностями дерева, т.к. в любой момент для любой точки можно рассматривать прямоугольник (объем) любой суммы смежных ячеек. Причем, поскольку все ячейки равноценны, в рассмотрение не попадет сильно избыточное число примитивов, как было бы в дереве, если нужный объем захватывает соседние "ветви". 3. Доступ к нужным площадям (объемам) при регулярном разбиении много проще - не нужно просматривать списки габаритов узлов (нод). Сам индекс ячейки указывает на определенную часть пространства. Т.е. никакого "разбиения", определения, описания ячеек не производится - определяется только попадание габаритов примитивов в ячейки как проверка на > < координат, кратных размерам ячеек. Нет необходимости и хранить описания самих ячеек. Достаточно хранить только не пустые списки элементов ячеек в порядке возрастания индекса. 4. При этом, регулярное разбиение позволяет считать пространство разбиения бесконечным и в +, и в -. Если принять за начало 0,0,0, и допустить индексы не только положительные, но и отрицательные. Т.е. изменение габаритов файлов не требует перестроения разбиения в целом. 5. Регулярное разбиение безусловно - проверка идет только на пересечение габаритов примитивов с ячейкой, т.е. не тратится время на анализ и принятие решений о том, в какой узел что помещать, как элементы относятся к другим элементам. Т.е. задачи стараться "вписать" примитивы нет, и "другие примитивы" не будут ничего "портить". Главное - подобрать оптимальный размер ячеек разбиения. Резервы: 1. Уже писал, что можно попробовать уточнять положение примитивов в ячейках за счет проверки попадания в них габаритов сегментов примитивов. Причем, делать это можно не сразу, не для всех примитивов, а по мере их обработки. 2. Можно попробовать хранить списки не только примитивов в ячейках, но и списки ячеек, в которые попадают примитивы. Возможно, что это еще упростило бы обработку. Т.е., рассматривая любой примитив, можно было бы сразу знать о других примитивах, находящихся в "его" ячейках. Причем, "его" ячейки в общем случае не образуют прямоугольник, т.е. не захватятся избыточные примитивы. |
||||
![]() |
|
||||
Регистрация: 18.12.2010
Сообщений: 5,115
|
Пурга, читай книжки ISBN: 978-5-8459-1744-7 (рус.)
![]() Update: 1. Сложность поиска в списке O(n) - где n - количество элементов. Сложность поиска в дереве O(h) - где h - высота дерева. Смотри у zamtmn Цитата:
Цитата:
Последний раз редактировалось trir, 23.09.2013 в 21:52. |
|||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
Имхо регулярное разбиение имеет приемущество только для постоянно меняющихся данных (желательно специально подготовленных) за счет возможно более быстрого "построения", ито это нужно провеить экспериментально или почитать книжки
>>а сухой остаток что-то жидковат Нифигасебе)) показано и как просто примитивы перебирать, и умные ссылки даны на всякие пространственные хитрости, и есть пример не очень умной реализации - всё разжевано, что еще надо то? Осталось только уволить програмиста и самому за реализацию взяться)) 1 - это главный минус - размер ячейки фиксирован - мелкие детализованные учстки чертежа окажутся в 1-2-3-4 "ячейках". Т.е. повышение детализации фрагмента чертежа не вызывает повышение детализации сетки. В случае даже самого простого бинарного дерева разбиение автоматически повышает детализацию на насыщенных участках чертежа. 2 - достоинство дерева при отбраковке вышестоящей ноды автоматом отбраковываются все нижестоящие. т.е. если мы ткнули мимо чертежа, тест корневой ноды сразу нам об этом скажет, а в сетке что об этом скажет? перебор всех ячеек? 3 - этот момент полностью аналогичен и в дереве и в сетке, т.к. разбивка хочешь нехочешь строится в габаритах чертежа, а не в абсолютных координатах в "бесконечном" пространстве 4 - нет, иначе придется хранить бесконечное количество пустых ячеек, для сохранения доступа к ним по индексу, см. п.3 5 - непонял. имхо все также как и с деревом, идеально выбрать сетку не выйдет и будет куча примитивов которые сидят в куче ячеек trir >>Сложность поиска в списке O(n) - где n - количество элементов. Сложность поиска в дереве O(h) - где h - высота дерева. Смотри у zamtmn Насколько я понимаю АлексЮстасу хочет сказать что в его сетке сложность будет O(1), но это действительно пурга, т.к. идеально разбить не подготовленные специально данные не получится. Последний раз редактировалось zamtmn, 23.09.2013 в 22:40. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Цитата:
Цитата:
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Цитата:
Цитата:
Но совершенно непонятно, что из этого практически применимо, эффективно для специфики Автокада, при программировании под Автокад, для нашего вида данных? Какой из видов деревьев для автокадовских данных эффективнее, в каких случаях, какие из деревьев, как лучше реализовать на том-другом языке, какой это может дать, дало реальный результат? zamtmn, результаты Вашей оптимизации впечатляют, бьют наповал, но что из этого выйдет в Автокаде? Впечатляет фантастическая скорость просмотра примитивов hwd, но неясно, как это помогает анализу геометрических отношений примитивов? Кроме этих двух реальных, реализованных примеров (не в Автокаде, не для анализа геометрии), получается, ничего не абстрактно-теоретичекого нет или великая тайна. Ну, значит, так. |
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Вы уверены, что понимаете о чем Вам пишут, а где и для чего по Вашему?? Если Вам этого мало - то просто не пытайтесь этим заниматься - это, так сказать, не Ваше...
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
regular.dxf я до сих пор не проверял:
- Autocad Map 3D - Drawing cleanup - Break intersections сделало на средней машине за примерно 3.5 секунды! - Лисп BreakObjects - на двадцатой, примерно, минуте я остановил процесс. Получается, что Autocad Map 3D для своих действий оптимизацию очень даже применяет. И про FlashPolygons от Delicad - сделал из всех пересечений элементов в меньшем nonregular2.dxf полигоны за 30 секунд. Цитата:
Как бы сделать создание новых примитивов из пересечений, чтобы и ресурсов хватало, и скорость была высокой? Общие подходы можете посоветовать? |
||||
![]() |
|
||||
Инженер САПР Регистрация: 12.11.2004
Тюмень
Сообщений: 36
![]() |
Извиняюсь, что встреваю в мудрые разговоры.
Раз дело касается AutoCAD, то и используйте его возможности. Как, например, здесь: объединение большого количества отрезков. Волшебная функция (ssget "_C" p1 p2) наверняка уже тыщу раз оптимизирована разработчиками, берите и используйте - тогда даже на обыкновенном autolisp все шустро просчитывается. Если непонятно: берете примитив, получаете его bounding box, по ним ssget - получаете (обычно) небольшой набор, по нему уже тупо перебором проверили реальные пересечения. И не надо никакой мороки со всякими индексами, ибо индексы уже есть в самом автокаде. |
|||
![]() |
|
||||
Регистрация: 16.08.2006
Санкт-Петербург
Сообщений: 508
![]() |
Поправьте меня, если я ошибаюсь: эта волшебная функция требует, что бы данный прямоугольник был на экране. Т.е. либо скакать по всему чертежу, либо масштабировать, что бы весь чертёж сразу был на экране.
При самостоятельной обработке я могу работать даже без открытия чертежа (открывая только базу данных), что гораздо быстрее при пакетной обработке, скажем. Да и в целях тестируемости лучше изолировать код, работающий непосредственно с автокадом как можно дальше (т.е. выделить зависимости от автокада в как можно меньшее кол-во классов, и только изредка их использовать) Так что оба метода имеют право на жизнь, у каждого своё предназначение. Аналог ssget в .net данном случае будет метод Editor.SelectCrossingPolygon
__________________
Алексей |
|||
![]() |
|
||||
Инженер САПР Регистрация: 12.11.2004
Тюмень
Сообщений: 36
![]() |
Цитата:
Абсолютно согласен, каждый подход имеет свое предназначение. Просто про вариант с ssget мало кто задумывается, а в большинстве случаев надо "не шашечки, а ехать". Да и объем кода получается на порядок меньше, проще сопровождать потом, в случае надобности. |
|||
![]() |
|
||||
Инженер САПР Регистрация: 12.11.2004
Тюмень
Сообщений: 36
![]() |
Цитата:
С чего программе работать медленно? Возьмем цифры с потолка - пусть в чертеже 10000 объектов. Если устроить тупой перебор: каждая линия с остальными, можете сами посчитать количество сочетаний (если не ошибаюсь, это будет 10000*9999/2= 49 995 000). А если пользуемся ssget (опять же условно возьмем, что в среднем ssget вернул 10 объектов для каждой анализируемой линии), то количество сочетаний 10000*10 = 100 000. Есть разница между 50 миллионами итераций и сотней тысяч? У меня чертеж с 20 000 объектов обрабатывается в лиспе за пару десятков секунд. |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Цитата:
а 40 тысяч за сколько он обработает - линейная зависимость??
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>Ведь для создания двревовидной структуры нужно время и для эффективного выполнения она создается 1 раз - а ssget'у не известно проходили-ли изменения чертежа между вызовами или нет.
Думаю в автокаде оная структура поддерживается в актуальном состоянии всегда. т.к. она важна не только для поиска чегонибудь, а практически для всех операций с чертежем. но ssget даже в реализации на компилируемом языке всеравно проиграет поиску с прямым доступом к "дереву" - т.к. он вынужден всегда начинать поиск с корня. также свое дерево заглаза себя оправдает для операций не на всем чертеже, а только над частью примитивов - дерево нужно будет строить только для них - операции с ним будут быстрее и сбалансированность лучше |
|||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Цитата:
Offtop: В этой строке немой намек вопрос главному по ARX А.Ривилису.
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Цитата:
Эта ssget выдает набор чего? Примитивов, пересекающих указанный? Примитивов, попадающих в габарит указанного примитива? Или еще что-то? Эта ssget чисто лисповская или у нее есть аналоги в ARX? |
||||
![]() |
|
||||
|
||||
![]() |
|
||||
Продуман Регистрация: 22.02.2007
Питер
Сообщений: 2,839
|
Я не про то, что там есть аналог ssget - может из ARX можно разглядеть структуру которую использует эта функция (то есть определяет простым перебором по БД, либо она таки использует пространственное индексирование - на основе например R-tree)?
__________________
Когда в руках молоток все вокруг кажется гвоздями. |
|||
![]() |
|
||||
Алгоритм конечно не виден. Но точно не простой перебор по БД, т.к. эта функция вообще с БД (AcDbDatabase) не работает, а работает с виртуальным экраном, т.е. с проекциями примитивов. Но этот подход имеет свой минус - примитивы должны быть видны и различимы.
|
||||
![]() |
|
||||
Да. Во всяком случае так было в те времена, когда я это проверял. Возможно что-то изменилось в последних трёх-четырёх версиях, но я сомневаюсь.
__________________
Сообщество программистов Autodesk в СНГ - техническая поддержка |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
Собственно ничего не мешает автокаду строить "деревъя" не над базой данных, а над хозяйством полученым после worldDraw (или что там для "отрисовки") всех примитивов, так даже проще на уровне примитивов - все сложности уходят в дпугой "слой" программы. Однако теже привязки считаются не над "проекциями" примитивов - иначе они бы сильно врали
|
|||
![]() |
|
||||
Moderator
LISP, C# (ACAD 200[9,12,13,14]) Регистрация: 25.08.2003
С.-Петербург
Сообщений: 40,450
|
Не совсем так.
__________________
Моя библиотека lisp-функций --- Обращение ко мне - на "ты". Все, что сказано - личное мнение. |
|||
![]() |
|
||||
Цитата:
Цитата:
Цитата:
Общее соображение: т.к. в общем случае примитивы равнозначны, то привязывать сведения о положении в пространстве примитивов к разным уровням дерева некорректно. Естественно определять их на одном, нижнем уровне. А на уровнях выше, соответственно, определять сведения о положении уже их множеств. Точнее - подпространств, из которых состоит пространство файла. При регулярном разбиении пространства файла есть преимущества. Оно представляет весь файл в виде матрицы или в виде как бы "растра"- кому какой образ больше говорит. На построение и сохранение собственно дерева время тратить не нужно. Но по регулярным ячейкам можно использовать любой подходящий для конкретной задачи алгоритм поиска, в том числе и дерево. Разделяя все множество ячеек (все пространство) на любые подходящие их подмножества: делением на две части, на четыре, сразу на 16, на нужное число уровней и т.п. Т.е. регулярное разбиение уже содержит все возможности дерева, уже есть дерево, причем, допущу, любого типа. Или, при анализе "снизу", можно брать смежные ячейки в нужном количестве. И не обязательно прямоугольниками, но и в наборе произвольной формы. При этом, взаимное положение любых ячеек априори известно без всякого дополнительного структурирования, без обращения к возможностям дерева. Сам оценить O() регулярного разбиения не возьмусь. |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>При регулярном разбиении пространства файла есть преимущества. Оно представляет весь файл в виде матрицы или в виде как бы "растра"- кому какой образ больше говорит
Возмите regular.dxf и сдвинте 1 "крестик" коданибудь в сторону например на 10000000 едениц чертежа - все "приемущества" регулярного разбиения на этом сразу закончатся, древовидная структура проглотит это незаметив, просто увеличив глубину на еденицу и сохранив тоже качество разбивки Последний раз редактировалось zamtmn, 29.09.2013 в 11:46. |
|||
![]() |
|
||||
Регистрация: 16.08.2006
Санкт-Петербург
Сообщений: 508
![]() |
АлексЮстасу, я не очень вникал в ваш алгоритм, но если претит R-Tree, или другие предложенные варианты, может будет более понятно quadtree
Но мне лично кажется, что для работы с объектами произвольных размеров (не точками), лучше работать с помощью R-Tree, хотя может я и ошибаюсь, quadtree я не пробовал
__________________
Алексей Последний раз редактировалось bargool, 29.09.2013 в 15:17. |
|||
![]() |
|
||||
Цитата:
Цитата:
Пытаюсь разобраться, какое или как лучше. Не в последнюю очередь - практически. Ведь из названных в теме вариантов пока нет под Автокад ни одного реализованного. Последний раз редактировалось АлексЮстасу, 30.09.2013 в 03:12. |
||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
>>В чем именно при таком сдвиге проблема для регулярного разбиения?
ээх, сколько можно об одном и томже)) В этом случае может быть 2 варианта реализации: 1 - ячейки в линейном "массиве" с быстрым доступом по индексу (как вы и предлагаете насколько я понял), но 99.99999% "ячеек" пустые и занимают всю доступную память - расход памяти зависит от геометрических размеров модели, а не от ее наполнения. 2 - храним только "заполненные" ячейки - доступ к ним не по индексу, а "перебором" с поиском нужной. И тут, ВНИМАНИЕ, для ускорения поиска в этой структуре придется вводить бинарное дерево. >>Ведь из названных в теме вариантов пока нет под Автокад ни одного реализованного Давайте уже делайте и выкладывайте)) |
|||
![]() |
|
||||
Инженер САПР Регистрация: 12.11.2004
Тюмень
Сообщений: 36
![]() |
Цитата:
Выберите объекты: Противоположный угол: найдено: 45306 Допустимое отклонение <0.2>: 1235 polylines generated, 43776 lines joined Выполнено за 21.013 сек. Что сырой лисп, что компилированный - время примерно одно - 20-21 сек на моей машине. UPD: только что проверил на свежескачанной бете BricsCAD 14 x64 - на глаз скорость чуть ли не в два раза выше, чем AutoCAD. Где-то читал, что Бриксис очень хорошо оптимизировал свой лисп-движок Последний раз редактировалось Мансур, 30.09.2013 в 08:50. |
|||
![]() |
|
|||||
Первые результаты на неплохой машине 64-разрядной, 16 Гб памяти:
regular.dwg Цитата:
nonregular2.dwg Цитата:
Цитата:
Взял regular.dwg, и перенес один крест на 10000000 в сторону: Цитата:
Это первый блин, который только сегодня мне, наконец, выложили. Как видите, "сетка" пока всегда одинаковая - 64x64. И что за "сетка", как что куда записывается, создается ли параллельно дерево и т.п. - пока не спрашивайте. Даже не спрашивайте, сетка ли там на самом деле или баобаб. Поскольку и наш программист тоже разговаривает на другом языке ![]() Надеюсь, мы "сетку" еще оптимизируем. Тогда главная будет проблема - требуются гигантские ресурсы на создание новых элементов, т.е. на разбиение на пересечениях? |
|||||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
Поздравляю с первым блином)) не совсем понял толко почему время создания так отличается на исходном и сдвинутом regular - сетка то там и там одинаковая - видимо реализация очень "наколенная". Также неясно с колвом пересечений - в регуляр их 10000 точно, в нонрегуляр2 - 22067 и нонрегуляр - 11559108 по моим результатам
Неплохо было бы приводить результаты для сетки 1х1 - чтоб было наглядно видно ускорение от повышения разрешения "сетки" >>требуются гигантские ресурсы на создание новых элементов требуется создание ~23 миллионов примитивов, помоему невыполнимая задача без промежуточных сохранений результатов. Да и нужно оно толко для "теста" - в реалной жизни такого не попадется. Имхо зря вы так схватились за сетку - это интересно только как "эксперимент", с практической точки зрения закончится тупиком - причины выше описаны |
|||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
Попал в руки ноут с i7 16Гб озу и 32Гб свапа.
nonregular.dxf таки был порезан, но с получеными на выходе миллионами линий графический движек зкада не совладал и впал в большую тоску(( поэтому цитата с лога, а не с вывода командной строки Код:
update: откудато набежало 2 "лишних" пересечения, вроде ничего серъезного не менял((. и со времнем внутри программы и фиксации в логе чтото нето(( Последний раз редактировалось zamtmn, 03.10.2013 в 01:40. |
|||
![]() |
|
||||
КИПиА Регистрация: 21.03.2005
Tyumen
Сообщений: 1,352
![]() |
Расчехлю лопату.
Переделал статистику по разбиению пространства и приделал визуализацию. может кому будет интересно. regular.dwg Цитата:
Цитата:
Цитата:
|
|||
![]() |
![]() |
|
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Документация Проектировщику на Torrents | DEM | Разное | 263 | 03.09.2024 12:25 |
Жилые и общественные здания: краткий справочник инженера-конструктора. Под ред. Ю.А. Дыховичного и В.И. Колчунова. 2011 (Впечатления и отзывы). | Armin | Поиск литературы, чертежей, моделей и прочих материалов | 19 | 22.03.2018 15:41 |
Порекомендуйте литературу для повышения квалификации(грунты, геотехника) | acid | Поиск литературы, чертежей, моделей и прочих материалов | 6 | 13.05.2015 22:14 |
Случайный эксцентриситет | p_sh | Прочее. Архитектура и строительство | 14 | 22.07.2009 11:32 |
Защита от распространения большого числа dwg | E.D. | AutoCAD | 24 | 21.11.2008 09:02 |