对于这个问题,我找到了大约 1000 个答案,但没有一个我可以使用,因为我的曲线使用了 4 个控制点。
也就是说,我在这里偶然发现了这个人:
double BezierArcLength(point2d p1, point2d p2, point2d p3, point2d p4)
{
point2d k1, k2, k3, k4;
k1 = -p1 + 3*(p2 - p3) + p4;
k2 = 3*(p1 + p3) - 6*p2;
k3 = 3*(p2 - p1);
k4 = p1;
q1 = 9.0*(sqr(k1.x) + sqr(k1.y));
q2 = 12.0*(k1.x*k2.x + k1.y*k2.y);
q3 = 3.0*(k1.x*k3.x + k1.y*k3.y) + 4.0*(sqr(k2.x) + sqr(k2.y));
q4 = 4.0*(k2.x*k3.x + k2.y*k3.y);
q5 = sqr(k3.x) + sqr(k3.y);
double result = Simpson(balf, 0, 1, 1024, 0.001);
return result;
}
看起来这将是一个完美的解决方案,但开始部分让我完全困惑:
k1 = -p1 + 3*(p2 - p3) + p4;
k2 = 3*(p1 + p3) - 6*p2;
k3 = 3*(p2 - p1);
k4 = p1;
我到底应该如何对二维对象进行加法、减法和乘法之类的操作(我认为 point2d 是一个类似的对象结构{x: 0, y: 0}
)?我觉得自己很愚蠢,但这是唯一让我无法真正实现这个怪物的事情。
FWIW,我正在使用这个方程来标准化实体在游戏中穿越曲线时的速度。如果您知道更好的方法来完全做到这一点,我会全力以赴。