如何确定点是否在Quad2DCurve上

问题描述 投票:0回答:1

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

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

bezier
1个回答
0
投票

我认为您的意思是QuadCurve2D类,它是二次Bezier曲线。似乎没有现成的方法,问题出在从点到贝塞尔曲线的距离上。让我们以P0为您的点,P1为起点,P2-控制点,P3为曲线的终点。然后曲线上的点将通过

给出
P = B(t)

有这样的t,对于PP0之间的距离将是最小的。

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

© www.soinside.com 2019 - 2024. All rights reserved.