对于任何碰巧发现我的问题的人来说,我解决了我自己的问题。要找到曲线的总距离,请将其分成 1000 个左右的部分(仍然相当准确),找到每个点之间的距离,然后将它们全部加在一起。 (您应该使用参数公式)
现在找出曲线上的百分比。 = 距离/曲线总长度
使用这个百分比作为 x 和 y 的新 t 值,现在您就有了新的 x 和 y 位置。
重要提示:这是一种奇怪的情况,但如果您的 t 值大于 1,请使用绝对值。当您对其进行立方时,该值将为负数...=发生不好的事情。
丑陋但相关的代码如下所示。
将曲线分成 1000 段
for (double t = 0.00; t < 1.001; t= t + .001) {
double xValue = Math.pow((1-t), 3) * point1x + 3 * Math.pow((1-t), 2) * t * point2x + 3 * (1-t) * Math.pow(t, 2) * point3x + Math.pow(t, 3) * point4x;
double yValue = Math.pow((1-t), 3) * point1y + 3 * Math.pow((1-t), 2) * t * point2y + 3 * (1-t) * Math.pow(t, 2) * point3y + Math.pow(t, 3) * point4y;
**现在是计算每个点之间的距离的时候。我建议将上述计算出的值放入数组中并循环遍历。
计算 x 和 y 位置
xPos = Math.abs(Math.pow((1 - percenttraveled), 3)) * point1x + 3 * Math.pow((1 - percenttraveled), 2) * percenttraveled * point2x + 3 * Math.abs((1 - percenttraveled)) * Math.pow(percenttraveled, 2) * point3x + Math.abs(Math.pow(percenttraveled, 3)) * point4x;
yPos = Math.abs(Math.pow((1 - percenttraveled), 3)) * point1y + 3 * Math.pow((1 - percenttraveled), 2) * percenttraveled * point2y + 3 * Math.abs((1 - percenttraveled)) * Math.pow(percenttraveled, 2) * point3y + Math.abs(Math.pow(percenttraveled, 3)) * point4y;