[英]How to find distance mid point of bezier curve?
我在 Unity 引擎中制作游戏,其中汽车沿着贝塞尔曲线移动,按贝塞尔曲线长度的百分比移动。
在这张图片上,您可以看到带有 8 个停止点(黄色球体)的曲线。 每个停靠点之间的距离为总距离的 20%。
在上图中,一切正常,但是当我移动手柄时,会出现手柄长度不同的问题。
如上图所示,停止点之间的距离不相等。 这是因为我的算法,因为我通过将段长度乘以插值(t)来找到段点。 简而言之,问题是:如果 t=0.5 它不在该段的 50% 中。 正如您在第一张图像上看到的,停止点位于半段,但在第二张图像中它不在半段。 这个问题将得到解决,如果有一些数学公式,如何找到距离中点。
如上图所示,有两个中点。 通过将 t 设置为 0.5 可以找到 T 参数中点(这是我现在正在做的),但它不是距离的一半。
如何找到距离中点(对于三次贝塞尔曲线,手柄的距离不同)?
您已经正确观察到参数值t =0.5 通常不是长度中间的点。 这是一个好的开始,但困难在于下面的数学。
用x(t)和y(t)表示参数曲线的分量, t =0(开始)和所选参数值t = u之间的曲线长度等于
您要做的是找到u使得l(u)是l(1)的一半。 这有时是可能的,但通常是困难的或不可能的。 所以,你可以做什么?
一种可能性是近似您想要的点。 一种直接的方法是通过分段线性曲线来近似贝塞尔曲线(只需选择许多参数值 0 = t _0 < t _1 <... < t _n = 1 并通过线段连接这些参数中的值)。 现在很容易计算整个长度(毕达哥拉斯定理是你的朋友)以及中点(沿着分段线性曲线走规定长度)。 您采样的点越多,您将越精确并且您的计算将花费更多时间,因此需要权衡。 当然,您可以使用更复杂的数值方案进行近似,但这超出了答案的 scope。
第二种可能性是将自己限制在贝塞尔曲线的一个子类中,它可以让你做你想做的事。 这些被称为毕达哥拉斯-Hodograph (简称PH)曲线。 它们具有非常有用的性质,即存在多项式sigma( t ),使得
这意味着您可以计算上面的积分并搜索u的正确值。 然而,一切都是有代价的,这里的代价是你将有更少的自由,在哪里放置控制点(对于我作为数学家来说,三次贝塞尔曲线有四个控制点;计算机图形学的人经常谈到“手柄”所以你可能不得不翻译成你的术语)。 对于立方体案例,您可以在 Vito Vitrih 的本次研讨会演讲的幻灯片 15 中找到条件。
表示:
您可以自行决定是否可以在您的情况下强制执行此条件,或者它是否对您的应用程序过于严格。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.