如何确定一个点是否位于Quad2DCurve上

时间:2011-09-15 12:39:06

标签: bezier quad

我已经在java中成功绘制了Quad2D或Bezier曲线。我有相同的等式。但我需要确定特定点(x,y)是否位于曲线上。我尝试使用Quad2D.contains和一些GeneralPath API,我无法准确地得到结果。

有人可以帮忙找出解决方案吗?

1 个答案:

答案 0 :(得分:0)

我认为你的意思是QuadCurve2D类,它是二次贝塞尔曲线。 似乎没有现成的方法,问题是从点到贝塞尔曲线的距离。 让P0成为你的观点,P1是一个起点,P2 - 一个控制点,P3是你的曲线的终点。 然后,曲线上的点将由

给出
P = B(t)

tPP0之间的距离最小。

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

如果距离为0或小于某个误差,则P0在曲线上。 通过最小化成本函数,可以通过Netwon的迭代方法找到t

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)最小的公式。