Как определить, лежит ли точка на Quad2DCurve - PullRequest
0 голосов
/ 15 сентября 2011

Я успешно нарисовал кривую Quad2D или Безье в Java.У меня есть уравнение для того же.Но мне нужно определить, лежит ли конкретная точка (x, y) на кривой или нет.Я пытался использовать Quad2D.contains и несколько API GeneralPath, но не смог точно получить результат.

Может ли кто-нибудь помочь найти решение этой проблемы?

1 Ответ

0 голосов
/ 05 сентября 2012

Я думаю, вы имели в виду класс QuadCurve2D, который является квадратичной кривой Безье. Кажется, для этого нет готового метода, и проблема заключается в расстоянии от точки до кривой Безье. Пусть P0 будет вашей точкой, P1 - начальная точка, P2 - контрольная точка, а P3 - конечная точка вашей кривой. Тогда точка на кривой будет иметь вид

P = B(t)

Существует такой t, для которого расстояние между P и P0 будет минимальным.

F(t) = (B(t)_x - P0_x)^2 + (B(t)_y - P0_y)^2 -> min

Если расстояние равно 0 или меньше определенной ошибки, то P0 находится на кривой. t можно найти с помощью итерационного метода Netwon, минимизировав функцию стоимости

t_n = t_n-1 + F'(t) / F''(t)

, где F' - первая производная функции стоимости, а F'' - ее вторая производная.

F'(t) = 2 * (B(t)_x - P0_x) * B'(t)_x + 2 * (B(t)_y - P0_y) * B'(t)_y
F''(t) = 2 * B'(t)_x * B'(t)_x + 2 * (B(t)_x - P0_x) * B''(t)_x +
         2 * B'(t)_y * B'(t)_y + 2 * (B(t)_y - P0_x) * B''(t)_y

Первая производная квадратичной кривой Безье B '(t) - это отрезок с начальной точкой (P2 - P1) и конечной точкой (P3 - P2). Вторая производная B''(t) является точкой P3 - 2 * P2 + P1.

Объединение всего вместе даст формулу для t, для которой F(t) минимально.

...