Algorithm 算法:如何在追踪的直线或曲线上找到位置?

Algorithm 算法:如何在追踪的直线或曲线上找到位置?,algorithm,curve,spline,Algorithm,Curve,Spline,给定一条被跟踪的线或曲线(比如一个鼠标跟踪应用程序,可以在其中绘制任何不间断的线或曲线),我想在该线或曲线上放置等距离的点(放置的点的数量可以变化)。执行此操作的最佳方法是什么?我建议使用向心Catmull-Rom样条线 这允许您使用用户单击或在各种鼠标移动事件中拾取的原始“点”。您仍然需要在端点上添加两个点来控制直线的初始和最终方向 使用向心Catmull Rom代替常规Rom的原因是为了避免自相交和尖点,这是线本身不需要的回路 原始Catmull Rom将沿曲线的距离参数化为t。由于曲线

给定一条被跟踪的线或曲线(比如一个鼠标跟踪应用程序,可以在其中绘制任何不间断的线或曲线),我想在该线或曲线上放置等距离的点(放置的点的数量可以变化)。执行此操作的最佳方法是什么?

我建议使用向心Catmull-Rom样条线

这允许您使用用户单击或在各种鼠标移动事件中拾取的原始“点”。您仍然需要在端点上添加两个点来控制直线的初始和最终方向

使用向心Catmull Rom代替常规Rom的原因是为了避免自相交和尖点,这是线本身不需要的回路

原始Catmull Rom将沿曲线的距离参数化为t。由于曲线的任何一段都使用该段之前的点和该段之后的点,因此中间两点之间的任何点的坐标都可以通过将参数t传递到范围为0到1的方程中进行插值,其中0等于P1,1为P2,其中四个控制点为P0、P1、P2,和P3

修改版的Catmull Rom在控制点之间进行定位。它仍然使用相同的4个控制点,并且仍然接受一个t值,您可以使用它来获得答案,但是t不再在P1和P2之间延伸从0到1的范围。相反,t的值将取决于欧几里德距离

作为中心点的例子,假设我有4个控制点,线段距离是4,9和16。我将实际使用距离的平方根,因此控制点的t值将为:

     UNIFORM                  CHORDAL               CENTRIPETAL                     
T0 = 0                          0                        0
T1 = 1                          4                   Sqrt(4) = 2
T2 = 2                          4 + 9 = 13          2 + Sqrt(9) = 5
T3 = 3                          13 + 16 = 29        5 + Sqrt(16) = 9
然后在P1和P2之间插值,我会选择一个t值,在T1和t2之间均匀分布,在向心的情况下是2和5


您的曲线是如何表示的?您已将其标记为“样条曲线”-这里是否涉及任何样条曲线?曲线是由用户跟踪的一系列鼠标位置。这是时间参数化的,而不是距离参数化的?在这些样条曲线中,它采用原始空间点,并使您能够沿平滑曲线在它们之间绘制等距点。时间只是一种表示样条曲线上进度的机制。在向心的情况下,通过合并控制点之间欧几里德距离的根来控制形状,以计算样条曲线应根据局部变化弯曲多少。它根本不涉及时间。如果跟踪曲线中存在循环,该算法是否有效?是的。只要有足够的控制点来定义回路形状,它就不会阻止自然样条线与自身相交。但在类似切换的情况下,它会阻止样条曲线生成控制数据点本身不循环的循环。