一个演示如何使用均匀分布的点绘制复杂路径:
http://jsfiddle.net/m1erickson/2fodu9pa/
均速概述
“速度”定义为单位时间内的距离。
“均速”因此是以每个单位时间行驶一定距离。
因此,以每秒2像素的速度沿着路径移动将是以均匀速度移动的示例。
要行进2像素,您必须计算沿路径上距离上一个点2像素的点。
在均匀速度下逐步绘制包含线条和曲线的路径需要进行数百个小计算。
以下是如何确定沿路径均匀间隔排列的点数组的方法:
将路径分成其段:线、二次曲线、贝塞尔曲线、线。
使用定义每个段的数学公式(参见下面的公式)计算每个段的许多(300+)点,并将这些点放入数组中。
依次沿每个点行走并计算两点之间的距离(参见下面的公式)。
保持行驶过的累积距离总数。
当当前已行驶的距离达到指定长度时,将该点保存在第二个数组中。
然后,为逐步动画路径,您可以创建一个动画循环,将一条线绘制到第二个数组中的每个下一个点。
注意:如果保持指定距离足够小(例如1-2像素),则所绘制的线条在必要时会呈现曲线。
以下是支持此方法的公式:
计算直线上的点:
function getLineXYatPercent(startPt,endPt,T) {
var dx = endPt.x-startPt.x;
var dy = endPt.y-startPt.y;
var X = startPt.x + dx*T;
var Y = startPt.y + dy*T;
return( {x:X,y:Y} );
}
计算二次曲线上的点:
function getQuadraticBezierXYatT(startPt,controlPt,endPt,T) {
var x = Math.pow(1-T,2) * startPt.x + 2 * (1-T) * T * controlPt.x + Math.pow(T,2) * endPt.x;
var y = Math.pow(1-T,2) * startPt.y + 2 * (1-T) * T * controlPt.y + Math.pow(T,2) * endPt.y;
return( {x:x,y:y} );
}
计算贝塞尔曲线上的点:
function getCubicBezierXYatT(startPt,controlPt1,controlPt2,endPt,T){
var x=CubicN(T,startPt.x,controlPt1.x,controlPt2.x,endPt.x);
var y=CubicN(T,startPt.y,controlPt1.y,controlPt2.y,endPt.y);
return({x:x,y:y});
}
function CubicN(T, a,b,c,d) {
var t2 = T * T;
var t3 = t2 * T;
return a + (-a * 3 + T * (3 * a - a * T)) * T
+ (3 * b + T * (-6 * b + b * 3 * T)) * T
+ (c * 3 - c * 3 * T) * t2
+ d * t3;
}
两点之间的距离:
var dx=point2.x-point1.x;
var dy=point2.y-point1.y;
var distance=Math.sqrt(dx*dx+dy*dy);
祝你的项目好运!