【发布时间】:2013-03-13 10:46:53
【问题描述】:
除了使用查找表之外,还有其他方法可以优化像这样的三次贝塞尔曲线的参数化算法吗? (5000 步的参数化对于速度较慢的 PC 来说实在是太多了,因为我需要在 1 秒内多次调用此函数):
function parameterizeCurve(path, partArc, initialT)
{
// curve length is already known and globally defined
// brute force
var STEPS = 5000; // > precision
var t = 1 / STEPS;
var aX=0;
var aY=0;
var bX=path[0], bY=path[1];
var dX=0, dY=0;
var dS = 0;
var sumArc = 0;
var arrT = new Array(Math.round(partArc));
var z = 1;
arrT[0] = -1;
var oldpartArc = partArc;
partArc = partArc - initialT;
var j = 0;
for (var i=0; i<STEPS; j = j + t) {
aX = bezierPoint(j, path[0], path[2], path[4], path[6]);
aY = bezierPoint(j, path[1], path[3], path[5], path[7]);
dX = aX - bX;
dY = aY - bY;
// deltaS. Pitagora
dS = Math.sqrt((dX * dX) + (dY * dY));
sumArc = sumArc + dS;
if (sumArc >= partArc) {
arrT[z] = j; // save current t
z++;
sumArc = 0;
partArc = oldpartArc;
}
bX = aX;
bY = aY;
i++;
}
return arrT;
}
function bezierPoint(t, o1, c1, c2, e1) {
var C1 = (e1 - (3.0 * c2) + (3.0 * c1) - o1);
var C2 = ((3.0 * c2) - (6.0 * c1) + (3.0 * o1));
var C3 = ((3.0 * c1) - (3.0 * o1));
var C4 = (o1);
return ((C1*t*t*t) + (C2*t*t) + (C3*t) + C4)
}
【问题讨论】:
-
输入是什么?你在优化什么?看起来您正在尝试最大化某种距离..
-
参数化是数学中众所周知的事情。我需要在曲线上放置等距元素。
-
曲线是如何定义的?它是分段的 3 度贝塞尔曲线还是其他?顺便说一句,我拥有数学硕士学位
-
三次贝塞尔曲线,以 1 开始 1 结束 2 个控制点。 path[0] 和 path[1] 是起点 X 和起点 Y。路径 6 和 7 是终点。其他是控制点。请阅读下面答案中的 cmets..
-
我编辑了源代码并添加了 BezierPoint 函数。