开发者

How to determine whether a point lies on Quad2DCurve

开发者 https://www.devze.com 2023-04-05 06:09 出处:网络
I have successfully drawn a Quad2D or Bezier curve in java. I have the equation for the same. But I need to determine whether a particular point(x,y) lies on the curve or not. I tried using Quad2D.con

I have successfully drawn a Quad2D or Bezier curve in java. I have the equation for the same. But I need to determine whether a particular point(x,y) lies on the curve or not. I tried using Quad2D.contains and a few GeneralPath APIs, I could not 开发者_开发问答get the result accurately.

Can someone help to find out the solution to this?


I think you've meant QuadCurve2D class, which is quadratic Bezier curve. There seems to be no ready-made method for that, and the problem comes to the distance from the point to the Bezier curve. Let's P0 will be your point, P1 is a start point, P2 - a control point and P3 is an end point of your curve. Then point on the curve will be given by

P = B(t)

There is such t, for which distance between P and P0 will be minimal.

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

If distance is 0 or less than certain error, then P0 is on the curve. t can be found with Netwon's iterative method by minimizing cost function

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

where F' is first derivative of cost function and F'' is its second derivative.

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

First derivative of quadratic Bezier curve B'(t) is a line segment with a start point (P2 - P1) and end point (P3 - P2). Second derivative B''(t) is a point P3 - 2 * P2 + P1.

Plugging everything together will give a formula to t for which F(t) is minimal.

0

精彩评论

暂无评论...
验证码 换一张
取 消