Поиск факта пересечения двух плоских фигур

Различные геометрические алгоритмы.
brigval
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 16.10.2005 (Вс) 12:37
Откуда: Подмосковье

Re: Поиск факта пересечения двух плоских фигур

Сообщение brigval » 21.12.2011 (Ср) 9:37

Хакер писал(а):
Proxy писал(а):Или представить дуги как ломаные перед проверкой пересечений.

Это ужасный путь. Он не только ошибко-опасный (неточный), но ещё и очень малопроизводительный, потому что будет много отрезков, и все возможные пары нужно проверить на пересечение.

Н-да. Пришлось воспользоваться этим ужасным путем. К сожалению, не потянул пока переделку кода на учет дуг в полигонах. (
Для практики, вроде проходит. Благодаря тому, что начинается проверка с проверки пересечния габаритных прямоугольников...

Но написать хотел не об этом.
Вставил для пробы предложенные исходники "как есть" в свою программу, рисующую и выращивающюю проводники печатной платы в SolidWorks (SW).

При проверке пересечения контуров проводников (а пересеченные контуры SW не выращивает) координаты точек из типа Double конвертируются в Single. Вот тут, подумал, и засада. Что видно из скриншота. Значения равны, а результат не верный.
(Как вставить картинку в текст, не разобрался)
NoIntersection_Math.gif
(50.13 Кб) Скачиваний: 172



Заменил в коде все Single на Double. Вроде сработало, но в другом месте опять появился неправильный результат.
NoIntersection_Math_2.gif
(50.53 Кб) Скачиваний: 157


На скриншотах показал и свое решение.

Это проблема VB6. А не кода. Но решил написать о ней, для полноты картины.

Хакер, большое спасибо за исходники.
brigval

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2753
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 21.12.2011 (Ср) 12:45

Во-первых, тип Single вообще желательно не использовать. А во-вторых, если нужна проверка на равенство при наличии некоторых вычислений, стоит использовать некую константу - максимальное отклонение.
Код: Выделить всё
a=b    =>   Abs(a-b)<EPS
a<=b   =>   a<=b+EPS
a<b    =>   a+EPS<b

И зачем сравнивать числа как строки? Это вообще бред.

brigval
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 16.10.2005 (Вс) 12:37
Откуда: Подмосковье

Re:

Сообщение brigval » 21.12.2011 (Ср) 13:00

Qwertiy писал(а):Во-первых, тип Single вообще желательно не использовать. А во-вторых, если нужна проверка на равенство при наличии некоторых вычислений, стоит использовать некую константу - максимальное отклонение.
Код: Выделить всё
a=b    =>   Abs(a-b)<EPS
a<=b   =>   a<=b+EPS
a<b    =>   a+EPS<b

И зачем сравнивать числа как строки? Это вообще бред.

Строки - просто, что первое в голову пришло.
Наверное, можно сравнивать и значения, округленные до некоторого знака после запятой. Это не вопрос. Конечно от строк лучше отойти.

Но вообще, немного не понятно. Обычно сравниваем числа, в т.ч. и Double, просто, без всяких ухищрений, а тут приходится придумывать способ сравнения... То есть, точно известно, что линии пересекаются, а вычисления в VB6 показывают обратное.
brigval

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Поиск факта пересечения двух плоских фигур

Сообщение Хакер » 21.12.2011 (Ср) 13:05

—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

brigval
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 16.10.2005 (Вс) 12:37
Откуда: Подмосковье

Re: Поиск факта пересечения двух плоских фигур

Сообщение brigval » 21.12.2011 (Ср) 13:41

Qwertiy
Хакер
Спасибо.
brigval

brigval
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 16.10.2005 (Вс) 12:37
Откуда: Подмосковье

Re: Поиск факта пересечения двух плоских фигур

Сообщение brigval » 22.12.2011 (Чт) 16:57

Уважаемый, Хакер, вам, как автору кода, сообщаю, что остановился пока на таком варианте:

Код: Выделить всё
Public Function CheckValueInRangeII(ByVal v As Double, _
                                    ByVal A As Double, _
                                    ByVal B As Double) As Boolean
   Dim A_rnd As Double
   Dim B_rnd As Double
   Dim v_rnd As Double
   v_rnd = Round(v, 7)
   A_rnd = Round(A, 7)
   B_rnd = Round(B, 7)
   If A < B Then
      CheckValueInRangeII = (A_rnd <= v_rnd) And (v_rnd <= B_rnd)
   Else
      CheckValueInRangeII = (B_rnd <= v_rnd) And (v_rnd <= A_rnd)
   End If
End Function


Во вложении последнее пересечение, которое не находилось как пересечение.
Теперь пока все работает.
NoIntersection_Poly.gif
(208.49 Кб) Скачиваний: 133
brigval

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Поиск факта пересечения двух плоских фигур

Сообщение Хакер » 22.12.2011 (Чт) 17:25

Если это печатные платы, то зачем искать пересечения?
Если это DRC, то там надо считать расстояния между дорожками.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Proxy
Профессор VB наук
Профессор VB наук
Аватара пользователя
 
Сообщения: 2941
Зарегистрирован: 31.08.2007 (Пт) 4:41

Re: Поиск факта пересечения двух плоских фигур

Сообщение Proxy » 22.12.2011 (Чт) 17:28

brigval писал(а):Значения равны, а результат не верный.

:D

ЗЫ. Хотелось бы поинтересоваться из любопытства, насколько обосновано использование строгого неравенства. Есть подозрение что это из области сначала оторвать человеку голову (...Или представить дуги как ломаные перед проверкой пересечений...), а потом пытаться пришить на место и отправить работать. Хотя не берусь утверждать, фрагмент слишком мал.
Follow the white rabbit.

brigval
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 16.10.2005 (Вс) 12:37
Откуда: Подмосковье

Re: Поиск факта пересечения двух плоских фигур

Сообщение brigval » 23.12.2011 (Пт) 8:30

Хакер писал(а):Если это печатные платы, то зачем искать пересечения?

Программа создает 3D-модель печатной платы.
Рисование и выращивание проводников по одной штуке занимает слишком много времени. Особенно при большом количестве проводников. Рисование и выращивание всех сразу не позволит вырастить вообще, если есть пересекающиеся проводники. Очень часто, из-за пересекающихся контуров САПР не выращивает эскиз вообще.
Поэтому найден компромисс: выращивание проводников группами не пересекающихся проводников. На данный момент это позволяет получить максимальную скорость работы программы в части выращивания.
brigval

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: Поиск факта пересечения двух плоских фигур

Сообщение Хакер » 23.12.2011 (Пт) 18:46

brigval писал(а):Рисование и выращивание проводников по одной штуке занимает слишком много времени.

Всегда когда вижу CAD-ы, которые долго это делают, сразу представляю себе криворуких программистов, которые не понимают самого главного. Тут нет ничего сверх-сложного, чтобы делать это дольше, чем мгновенно.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

FireFenix
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1640
Зарегистрирован: 25.05.2007 (Пт) 10:24
Откуда: Mugen no Sora

Re: Поиск факта пересечения двух плоских фигур

Сообщение FireFenix » 23.12.2011 (Пт) 22:47

Хакер писал(а):
brigval писал(а):Рисование и выращивание проводников по одной штуке занимает слишком много времени.

Всегда когда вижу CAD-ы, которые долго это делают, сразу представляю себе криворуких программистов, которые не понимают самого главного. Тут нет ничего сверх-сложного, чтобы делать это дольше, чем мгновенно.

По моему это всегда граничит со знаниями софта юзера и умением их применить, а также установленными патчами

И возможно мои данные устарели, но вроде SolidWorks среда для 3D проектирования деталей по ЕСКД + сопромат + аэродинамика и к составлению схем, моделированию и выращиванию не имеет никакого отношения
Птицей Гермеса меня называют, свои крылья пожирая... сам себя я укрощаю
私はヘルメスの鳥 私は自らの羽根を喰らい 飼い慣らされる

brigval
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 16.10.2005 (Вс) 12:37
Откуда: Подмосковье

Re: Поиск факта пересечения двух плоских фигур

Сообщение brigval » 24.12.2011 (Сб) 17:10

Хакер писал(а):
brigval писал(а):Рисование и выращивание проводников по одной штуке занимает слишком много времени.

Всегда когда вижу CAD-ы, которые долго это делают, сразу представляю себе криворуких программистов, которые не понимают самого главного. Тут нет ничего сверх-сложного, чтобы делать это дольше, чем мгновенно.

Для управления объектами САПР пользуюсь хелпом, предлагаемым этим САПР. Если САПР выполняет команду построения линии, например, за несколько десятых секунды, то не представляю как можно ускорить его работу изменяя алгоритм. Есть команда из хелпа, есть время ее выполнения.

Подозреваю, что замедленная работа может объясняться и созданием файлов отката для выполнения команды Undo. Но в настройках САПР (SolidWorks, Autodesk Inventor, CATIA) не нашел возможности отключения создания файла отката. В Inventor можно менять его размер, но не отключить совсем.

А оптимизацией занимаюсь, конечно. Используюя свойства САПР. Например, если выращивать 1000 проводников за раз, то они могут рисоваться несколько часов (особенно медленно рисуются последние линии) и выращиваться потом тоже долго. А если рисовать и выращивать группами по 50-100 штук за раз, то работа программы занимает до двадцати минут. Разница существенная.
Цифры на вскидку. Условные. Но принцип работает.
Последний раз редактировалось brigval 24.12.2011 (Сб) 17:35, всего редактировалось 5 раз(а).
brigval

brigval
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 176
Зарегистрирован: 16.10.2005 (Вс) 12:37
Откуда: Подмосковье

Re: Поиск факта пересечения двух плоских фигур

Сообщение brigval » 24.12.2011 (Сб) 17:27

FireFenix писал(а):И возможно мои данные устарели, но вроде SolidWorks среда для 3D проектирования деталей по ЕСКД + сопромат + аэродинамика и к составлению схем, моделированию и выращиванию не имеет никакого отношения

SolidWorks предназначен для проектирования и приборов в том числе. И создание печатных плат в нем имеет смысл. Можете мне поверить, потому что я занимаюсь проектированием приборов профессионально. Не в SolidWorks, правда. Но это не мешает делать программу и для SolidWorks.
brigval

Пред.

Вернуться в Геометрия

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

    TopList