[CDR X5-X8] найти ближайшую точку на шейпе к данной точке

Статус
Закрыто для дальнейших ответов.

Nezar

Участник
Топикстартер
Сообщения
158
Реакции
3
есть некая точка с координатами x y
есть шейп.
нужно найти ближайшую точку к заданной.
математически все просто.
но есть одно но.
вариант обхода всех узлов не подходит, т.к. в подавляющем большинстве их не много, поэтому и всевозможные изгибы будут просто игнорироваться.
вышел из положения добавлением узлов на кривую.
но, как то это не красиво что ли, да и долговато.

может есть какая то волшебная функция, которая находит ближайшую точку, а вернее координату ( т.к. точки - узла может там и не быть) на границе кривой, к заданной точке?
Спасибо!
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Странного хотите однако
Первое что приходит на ум - строить итерационный алгоритм построения концентрических окружностей с центром в заданной точке и поиска точек пересечения с кривой.'hmmm'
 
  • Спасибо
Реакции: Nezar

Nezar

Участник
Топикстартер
Сообщения
158
Реакции
3
проблема в том что нет уравнения кривой.
есть только две точки - узла, а между ними что угодно но только не прямая
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Вас это не должно смущать
Ведь есть прекрасный метод GetIntersections
 
  • Спасибо
Реакции: Nezar

Nezar

Участник
Топикстартер
Сообщения
158
Реакции
3
Вас это не должно смущать
Ведь есть прекрасный метод GetIntersections
думаю то что надо! не знал про него

Формула кривой Безье.
я понимаю что она гдето есть, но не уверен что вытаскивание ее и потом анализ будет быстрее чем добавление узлов и перебор по ним.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835

Fog_patch

12 лет на форуме
Сообщения
3 163
Реакции
998
я понимаю что она гдето есть, но не уверен что вытаскивание ее и потом анализ будет быстрее чем добавление узлов и перебор по ним.
Формула есть в википедии. Насчёт быстрее не знаю, но точнее он (анализ) будет.
Это как - решать мильён (по числу сегментов) систем уравнений третьего порядка? Xорошая идея '))'
Не на калькуляторе ведь решать? Вам какая разница? Процессор это порешает за секунды или даже доли секунды.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Процессор это порешает за секунды или даже доли секунды.
Ну вообще говоря, это не совсем тривиальная задача в общем случае
Вдобавок, мы же все таки программируем на бейсике а не используем какие то математические пакеты - доли секунды могут растянуться на часы ;)
Ну и на закуску - вы сходу можете написать формулу расчета ближайшей точки на кривой Безье? 'hmmm'
 

splxgf

12 лет на форуме
Сообщения
7 740
Реакции
3 421

Fog_patch

12 лет на форуме
Сообщения
3 163
Реакции
998
Ну и на закуску - вы сходу можете написать формулу расчета ближайшей точки на кривой Безье? 'hmmm'
С ходу я ничего не могу, у меня гуманитарное образование. Но такая формула – это геометрия за какой-то класс, при условии, что координаты точки на кривой уже вычислены.
 

Nezar

Участник
Топикстартер
Сообщения
158
Реакции
3
Ведь есть прекрасный метод GetIntersections
явно чтото не так делаю.
у меня есть некая кривая - шейп
потом создаю круг
Set krd = ActiveLayer.CreateEllipse2(xn, yn, 10)
krd.ConvertToCurves
Set cps = s.GetIntersections(s)
и не работает.
хелп особо не помог, т.к. я не понимаю Set seg1 = ActiveShape.Curve.SubPaths(1).Segments(1)
как сегменты достать или сделать из моих кривых ((
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Для квадрата и точки его центра будет целых четыре результата.
Ну, допустим, алгоритм итерационный, при R=R1 точек пересечения нет, при R=R1+delta точек пересечения 8 и площадь пересечения ненулевая, уменьшаем delta до тех пор, пока площадь пересечения не станет нулевой, а количество точек пересечения минимальным
Классическая оптимизационная задача
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
геометрия за какой-то класс
Кубические уравнения в общем случае никогда не входили в школьную программу
Причем, ЕМНИС, не всегда аналитическое решение есть вообще
 

Nezar

Участник
Топикстартер
Сообщения
158
Реакции
3
А есть идея как пересечение свести к одной точке?
Для квадрата и точки его центра будет целых четыре результата.
для моего случая не критично. такого идеального варианта не будет. а если и будет - то мне все равно где точка. важно расстояние. а оно одинаково.
когда точек будет несколько - то небольшим перебором по ним найду наименьшее расстояние.
все же быстрее чем по 10000 точкам бегать.... наверное.
сверх точность не важна
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835

Fog_patch

12 лет на форуме
Сообщения
3 163
Реакции
998
@_MBK_, кубические уравнения пускай решает компьютер (пускай лошадь думает, у неё голова большая), я про вычисление расстояния между двумя точками на плоскости.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
как сегменты достать или сделать из моих кривых ((
Вот была тема про это
пускай лошадь думает, у неё голова большая
Ну сперва лошади надо объяснить как думать - не так ли?
А это иной раз сложнее сделать чем самому посчитать за нее маленькой головой '))'
 

splxgf

12 лет на форуме
Сообщения
7 740
Реакции
3 421
Кстати в кореле спокойно можно добавить дополнительные узлы к кривой, этого будет достаточно для большинства практических целей.
Хотя можно и позаморачиваться Адаптивное разбиение кривых Безье
 

Nezar

Участник
Топикстартер
Сообщения
158
Реакции
3
не то скопировал.
Set cps = krd.GetIntersections(s)
 
Статус
Закрыто для дальнейших ответов.