我已经在Java中成功绘制了Quad2D或Bezier曲线。我有同样的方程。但是我需要确定特定点(x,y)是否位于曲线上。我尝试使用Quad2D.contains和一些GeneralPath API,但无法准确获得结果。
有人可以帮忙找出解决方案吗?
我认为您的意思是QuadCurve2D类,它是二次Bezier曲线。似乎没有现成的方法,问题出在从点到贝塞尔曲线的距离上。让我们以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在曲线上。通过最小化成本函数,可以使用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)
最小。