由函数定义的两条曲线之间的最短距离

时间:2015-11-24 14:48:27

标签: algorithm geometry

我有两个函数描述2D中的两条曲线。

p1 = f1(t1)
p2 = f2(t2)

其中p1p2是向量,t1t2是标量值介于0.0和1.0之间的标量。

曲线都凸出,“肚子”彼此面对。它们可以被旋转,并且可以定义新函数y = h(x),使得它们在x上的导数可以单调递增/递减。

示例:

two curves

我正在尝试找到一种有效的算法来找到这些曲线之间的最小距离。

我认为可能的方法是定义距离函数:

g(t1, t2) = |f1(t1) - f2(t2)|

然后使用Newton's method的泛化来求解方程系统

0 = ∂g(t1, t2)/∂t1    // partial derivative of g for t1
0 = ∂g(t1, t2)/∂t2    // partial derivative of g for t2

但是,我不确定这是否正确,而且有点不方便,因为我需要g的第一个和第二个导数,我必须用数字计算。

有没有更简单,可能更快的算法呢?

2 个答案:

答案 0 :(得分:2)

如果曲线平滑,可以尝试用圆弧近似它们。这是通过沿曲线采样点三元组并检查中间点是否比它们形成的圆弧的给定公差更接近来完成的。 (这是“曲线展平”的一种通用方法;你可以递归地进行)。

如果公差合理,弧的数量将非常适中(通常为10-20),您可以彻底测试弧/弧距离。

查看“用圆形ARCS和VICE VERSA逼近CUBIC BEZIER曲线”以获得灵感。

为了便于说明,下图是利萨如曲线的三个离散化,公差分别为2,0.5和0.125(21,31和50弧)。<​​/ p>

enter image description here 与具有展平的相同曲线(相同的公差,58,120和248线段)进行比较。

enter image description here

答案 1 :(得分:1)

问题就像在z0<=x<=1区域的3维上找到0<=y<=1的最小值。在这种情况下,z是| error | xt1yt2

而不是使用|f1(t1) - f2(t2)|,建议z= pow(f1(t1) - f2(t2),2)使其更平滑,并寻找最低限度。

由于f1(t1)f2(t2)的特征似乎没有受到强烈控制,建议二维搜索,如

https://stackoverflow.com/a/6910155/2410359
https://stackoverflow.com/a/6909573/2410359