アプローチ
位置を取得するには、ベジエの計算を再現する必要があるため、ベジエを使用するのとは別のアプローチをお勧めします。
単純な三角法を使用すると、同じ視覚的結果を得ることができますが、さらに位置を完全に制御できます。
三角法
例えば:
このオンラインデモでは、次の結果が生成されます (デモ用の簡略化されたバージョン)。
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();
}
レンダリングはボール配列を反復処理し、角度 + デルタでレンダリングします。
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 位置に置き換えることができますが、率直に言って必要ありません。
このデモでは、簡単にするために、マウスの移動のみを添付しました。マウスをキャンバス上に移動して効果を確認します。
これはデモ コードであるため、最適な構造ではありません (背景と円などの個別のレンダリング)。
ニーズに合わせて自由に採用および変更してください。