我已经在java中成功绘制了Quad2D或Bezier曲线。我有相同的等式。但我需要确定特定点(x,y)是否位于曲线上。我尝试使用Quad2D.contains和一些GeneralPath API,我无法准确地得到结果。
有人可以帮忙找出解决方案吗?
答案 0 :(得分:0)
我认为你的意思是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在曲线上。 通过最小化成本函数,可以通过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)
最小的公式。