方法
我会建议一种与使用贝塞尔曲线不同的方法,因为您需要为其重现数学才能获得位置。
通过使用简单的三角法,您可以获得相同的视觉效果,但还可以完全控制位置。
三角学
例如:
这个在线演示产生这个结果(为了演示的简化版本):
使用圆和角度位置而不是 y 和 x 位置定义一个数组。您可以稍后过滤角度(例如,仅显示 -90 到 90 度之间的角度)。
使用角度将确保它们在移动时保持有序。
var balls = [-90, -45, 0, 45]; // example "positions"
要替换贝塞尔曲线,您可以这样做:
/// some setup variables
var xCenter = -80, /// X center of circle
yCenter = canvas.height * 0.5, /// Y center of circle
radius = 220, /// radius of circle
x, y; /// to calculate line position
/// draw half circle
ctx.arc(xCenter, yCenter, radius, 0, 2 * Math.PI);
ctx.stroke();
现在我们可以使用鼠标移动/触摸等的 Y 值来绕圈移动:
/// for demo, mousemove - adopt as needed for touch
canvas.onmousemove = function(e) {
/// get Y position which is used as delta to angle
var rect = demo.getBoundingClientRect();
dlt = e.clientY - rect.top;
/// render the circles in new positions
render();
}
渲染遍历 balls 数组并以它们的角度 + delta 渲染它们:
for(var i = 0, angle; i < balls.length; i++) {
angle = balls[i];
pos = getPosfromAngle(angle);
/// draw circles etc. here
}
神奇的功能是这样的:
function getPosfromAngle(a) {
/// get angle from circle and add delta
var angle = Math.atan2(delta - yCenter, radius) + a * Math.PI / 180;
return [xCenter + radius * Math.cos(angle),
yCenter + radius * Math.sin(angle)];
}
radius
用作伪位置。您可以将其替换为实际的 X 位置,但坦率地说是不需要的。
在这个演示中,为了简单起见,我只附加了鼠标移动。将鼠标移到画布上以查看效果。
由于这是演示代码,它的结构不是最优的(背景和圆圈等的单独渲染)。
随意采用和修改以满足您的需求。