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

  • Автор темы Автор темы Nezar
  • Дата начала Дата начала
Статус
Закрыто для дальнейших ответов.

Nezar

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

может есть какая то волшебная функция, которая находит ближайшую точку, а вернее координату ( т.к. точки - узла может там и не быть) на границе кривой, к заданной точке?
Спасибо!
 
Странного хотите однако
Первое что приходит на ум - строить итерационный алгоритм построения концентрических окружностей с центром в заданной точке и поиска точек пересечения с кривой.'hmmm'
 
  • Спасибо
Реакции: Nezar
проблема в том что нет уравнения кривой.
есть только две точки - узла, а между ними что угодно но только не прямая
 
Вас это не должно смущать
Ведь есть прекрасный метод GetIntersections
 
  • Спасибо
Реакции: Nezar
Вас это не должно смущать
Ведь есть прекрасный метод GetIntersections
думаю то что надо! не знал про него

Формула кривой Безье.
я понимаю что она гдето есть, но не уверен что вытаскивание ее и потом анализ будет быстрее чем добавление узлов и перебор по ним.
 
я понимаю что она гдето есть, но не уверен что вытаскивание ее и потом анализ будет быстрее чем добавление узлов и перебор по ним.
Формула есть в википедии. Насчёт быстрее не знаю, но точнее он (анализ) будет.
Это как - решать мильён (по числу сегментов) систем уравнений третьего порядка? Xорошая идея '))'
Не на калькуляторе ведь решать? Вам какая разница? Процессор это порешает за секунды или даже доли секунды.
 
Процессор это порешает за секунды или даже доли секунды.
Ну вообще говоря, это не совсем тривиальная задача в общем случае
Вдобавок, мы же все таки программируем на бейсике а не используем какие то математические пакеты - доли секунды могут растянуться на часы ;)
Ну и на закуску - вы сходу можете написать формулу расчета ближайшей точки на кривой Безье? 'hmmm'
 
Ну и на закуску - вы сходу можете написать формулу расчета ближайшей точки на кривой Безье? 'hmmm'
С ходу я ничего не могу, у меня гуманитарное образование. Но такая формула – это геометрия за какой-то класс, при условии, что координаты точки на кривой уже вычислены.
 
Ведь есть прекрасный метод GetIntersections
явно чтото не так делаю.
у меня есть некая кривая - шейп
потом создаю круг
Set krd = ActiveLayer.CreateEllipse2(xn, yn, 10)
krd.ConvertToCurves
Set cps = s.GetIntersections(s)
и не работает.
хелп особо не помог, т.к. я не понимаю Set seg1 = ActiveShape.Curve.SubPaths(1).Segments(1)
как сегменты достать или сделать из моих кривых ((
 
Для квадрата и точки его центра будет целых четыре результата.
Ну, допустим, алгоритм итерационный, при R=R1 точек пересечения нет, при R=R1+delta точек пересечения 8 и площадь пересечения ненулевая, уменьшаем delta до тех пор, пока площадь пересечения не станет нулевой, а количество точек пересечения минимальным
Классическая оптимизационная задача
 
геометрия за какой-то класс
Кубические уравнения в общем случае никогда не входили в школьную программу
Причем, ЕМНИС, не всегда аналитическое решение есть вообще
 
А есть идея как пересечение свести к одной точке?
Для квадрата и точки его центра будет целых четыре результата.
для моего случая не критично. такого идеального варианта не будет. а если и будет - то мне все равно где точка. важно расстояние. а оно одинаково.
когда точек будет несколько - то небольшим перебором по ним найду наименьшее расстояние.
все же быстрее чем по 10000 точкам бегать.... наверное.
сверх точность не важна
 
@_MBK_, кубические уравнения пускай решает компьютер (пускай лошадь думает, у неё голова большая), я про вычисление расстояния между двумя точками на плоскости.
 
как сегменты достать или сделать из моих кривых ((
Вот была тема про это
пускай лошадь думает, у неё голова большая
Ну сперва лошади надо объяснить как думать - не так ли?
А это иной раз сложнее сделать чем самому посчитать за нее маленькой головой '))'
 
Кстати в кореле спокойно можно добавить дополнительные узлы к кривой, этого будет достаточно для большинства практических целей.
Хотя можно и позаморачиваться Адаптивное разбиение кривых Безье
 
не то скопировал.
Set cps = krd.GetIntersections(s)
 
Статус
Закрыто для дальнейших ответов.