我有两个函数描述2D中的两条曲线。
p1 = f1(t1)
p2 = f2(t2)
其中p1
和p2
是向量,t1
和t2
是标量值介于0.0和1.0之间的标量。
曲线都凸出,“肚子”彼此面对。它们可以被旋转,并且可以定义新函数y = h(x)
,使得它们在x
上的导数可以单调递增/递减。
示例:
我正在尝试找到一种有效的算法来找到这些曲线之间的最小距离。
我认为可能的方法是定义距离函数:
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
的第一个和第二个导数,我必须用数字计算。
有没有更简单,可能更快的算法呢?
答案 0 :(得分:2)
如果曲线平滑,可以尝试用圆弧近似它们。这是通过沿曲线采样点三元组并检查中间点是否比它们形成的圆弧的给定公差更接近来完成的。 (这是“曲线展平”的一种通用方法;你可以递归地进行)。
如果公差合理,弧的数量将非常适中(通常为10-20),您可以彻底测试弧/弧距离。
查看“用圆形ARCS和VICE VERSA逼近CUBIC BEZIER曲线”以获得灵感。
为了便于说明,下图是利萨如曲线的三个离散化,公差分别为2,0.5和0.125(21,31和50弧)。</ p>
答案 1 :(得分:1)
问题就像在z
和0<=x<=1
区域的3维上找到0<=y<=1
的最小值。在这种情况下,z
是| error | x
为t1
,y
为t2
。
而不是使用|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