我有一款游戏,要求每个玩家沿着一条指定的路径移动。我使用贝塞尔曲线绘制路径。如何确定路径的总真实(非线性)长度和每个玩家的距离?(起点和路径上指定点之间的距离。)
更新:
路径以笛卡尔平面(2D)表示。
我有一款游戏,要求每个玩家沿着一条指定的路径移动。我使用贝塞尔曲线绘制路径。如何确定路径的总真实(非线性)长度和每个玩家的距离?(起点和路径上指定点之间的距离。)
更新:
路径以笛卡尔平面(2D)表示。
Answers:
测量贝塞尔曲线的长度很困难。如果您不介意有一点点误差,那么一个简单的解决方案就是用直线近似贝塞尔曲线并计算线长的总和。您创建的细分越多,近似值越好。
必须近似高阶(即大于1阶)样条长度参数化;它不能直接表示,因此要找到直接的解决方案并不容易。
一些现有的实现(复制粘贴代码):
这组作者说,使用Chebyshev逼近法,精度随着曲线尺寸的增加而提高。请看第7-8页的伪代码,其余部分是对其他算法的描述,基于这些算法,您可以忽略它们。在线上有许多参考资料将此方法称为一种很好的方法。
另请参见这些简洁的方法。
最初是作为对@bummzack答案的评论的评论,但时间过长。
我如何确定我应该有多少段
有两种方法。第一个只是用于绘制贝塞尔曲线的标准算法:控制点形成曲线的边界框,因此,如果所有控制点都在从起点到终点的线段的epsilon内,则您近似为一条线;否则,您可以使用de Casteljau算法进行细分。根据最终结果中希望的误差选择Epsilon。(对于渲染,通常为0.5像素)。
另一种方法是使用间隔算法的改进。以从头到尾的线的长度为下限,以通过控制点的线的长度之和为上限。同样,根据最终错误要求进行细分。
通常可以在t = 0.5处进行细分,但是de Casteljau的算法允许在任意点进行分割,因此,如果您具有控制点C_0至C_3的三次贝塞尔曲线,并且C_2比C_1更接近端点之间的线段,则可能会发现在1/3或2/3之一会给出更严格的界限。我还没有研究过代数来证明哪种方法更好,但是如果您愿意,您可以进行实验并提出报告。如果没有别的,我想指出的是那里的选项。
可以通过对sqrt((dx / dt)²+(dy / dt)²)进行积分来计算参数化曲线的长度,其中dx / dt是曲线的x分量的导数,dy / dt是曲线的y分量的导数。在贝塞尔样条曲线的情况下,这两个是相同的,因为方程可以扩展到任意维度。
三次贝塞尔样条曲线的公式如下:B(t)=(1-t³)* P0 + 3(1- t)²t* P1 + 3(1- t)t²* P2 +t³P3其中P0至P3是控制点。
根据Wolfram | Alpha,此公式的导数为:d(B(t))/ dt = 3(t(t(P3-P0)+ P2(2-3t)+ P1(3t²-4t + 1))
现在,您可以将其重新放入曲线长度的方程式中,并计算从t = 0到t = 1的积分。不幸的是,当我尝试这样做时,Wolfram | Alpha会超时。但是,您可以进行数值积分。