Тема: Оптимизация нахождения пересечений.

Подскажите как можно оптимизировать макрос находящий пересечения отрезка с множеством полилиний.
Сложность заключается в том, что в полилиниях встречается очень большое количество точек (десятки тысяч), и самих полилиний тоже много (сотни).
Пересечения нахожу путем вычисления для отрезка и каждой пары точек полилинии уравнений прямой, проверки их параллельности, и расположения точек относительно друг друга.
Т.к. точек и полилиний крайне много, и проверять приходится все точки (т.к. полилиния может быть любой формы и пересечений может быть больше одного), процесс подсчета пересечений занимает иногда до получаса.
В данный момент оптимизировал вычисления путем дополнительного условия - нахождения точек полилинии в прямоугольнике (x1y1 - x1y2 - x2y2 - x2y1), который "образует" отрезок  - если точки находятся не в нем - вычисления не производятся - время вычисления заметно уменьшилось.
Возможно Вы подскажите как можно еще оптимизировать вычисления.
PS. Есть ли возможность использовать в VBA многопоточность?

Re: Оптимизация нахождения пересечений.

Не знаю поможет Вам это, но вот варианты:
1. Вот тут обсуждали что то похожее http://forum.dwg.ru/showthread.php?t=103683&page=2
2. Переписать программу на .NET или C++
3. Изменить логику программы и обрабатывать данные ВНЕ автокада.
4. Нет, в VBA нет многопоточности, и судя по вот этому (https://sites.google.com/site/bushmansn … -i-autocad), многопоточности нет в самом автокаде.

Все что выше ИМХО и решать только Вам. Удачи.

Re: Оптимизация нахождения пересечений.

Прикрутил таймер на разных частях кода. Выяснил очень интересную вещь - наиболее время затратная операция - получение координат полилинии.
Оптимизировал - предварительно копирую координаты в массив, после чего операции произвожу с массивом.
Координаты получаю так:
Set CurrentPline = ddd(i)
FPoints(UBound(FPoints) - 2) = CurrentPline.Coordinates(ii * 3)
FPoints(UBound(FPoints) - 1) = CurrentPline.Coordinates(ii * 3 + 1)
FPoints(UBound(FPoints)) = CurrentPline.Elevation

Например теперь если вообщем макрос выполняется 174сек, то из них на операции копирования координат в массив уходит 153 с.
Есть ли другие способы получения координат полилиний/3дполилиний?

Re: Оптимизация нахождения пересечений.

AnteC пишет:

Есть ли другие способы получения координат полилиний/3дполилиний?

Я о других способах не знаю, но есть другой способ получения точек пересечений, при котором не нужно считывать вершины полилинии. Тут подробнее: http://vbamodel.narod.ru/AutoCAD/idh_intersectwith.htm

Re: Оптимизация нахождения пересечений.

Спасибо, не знал этого метода, поэтому считал пересечения сам. Однако проблема в том, что есть случаи, когда нужно находить "кажущееся пересечение" т.е. полилинии нарисованы как 3д полилинии. В этом случае данный метод не возвращает ничего. Пытаюсь нагуглить есть ли такой метод не учитывающий z, но пока не могу найти.

Re: Оптимизация нахождения пересечений.

AnteC пишет:

FPoints(UBound(FPoints)) = CurrentPline.Elevation

Судя по этому фрагменту, кто Вам мешает перед получением пересечений, назначить этому параметру уровень линии с которой ищите пересечение, а потом восстановить исходное значение? Или вообще обнулить этот параметр у обоих объектов?

(изменено: AnteC, 17 октября 2013г. 12:52:20)

Re: Оптимизация нахождения пересечений.

Еще раз спасибо. Все получилось, теперь очень быстро :)
ЗЫ изменение высоты работает, только если 3дполилиния имеет во всех точках одинаковые высоты (у меня как раз такая ситуация).