次の関数を使用して、マウスの動きを追跡し、オブジェクトを回転させています。
function getAngle(dx, dy) {
var angle
if (dx != 0) {
var radians = Math.atan(dy / dx) + (dx < 0 ? Math.PI : 0)
angle = radiansToDegrees(radians);
if (angle < 0) angle += 360;
} else {
angle = dy > 0 ? 90 : 270;
}
return angle;
}
function getAngleBetweenPoints(p1, p2) {
var dx = p1.x - p2.x
var dy = p1.y - p2.y
return getAngle(dx, dy)
}
$(document).mousemove(function (e) {
if (selectionBounds) {
var midpoint = new pe.Classes.Point(selectionBounds.Left + (selectionBounds.Width / 2), selectionBounds.Top + (selectionBounds.Height / 2));
var mousepoint = new pe.Classes.Point(e.pageX, e.pageY);
var angle = getAngleBetweenPoints(midpoint, mousepoint);
if (lastAngle) {
var diff = angle - lastAngle;
rotate(degreesToRadians(diff));
}
lastAngle = angle;
}
});
これは、マウスをゆっくり動かし、マウスが原点(中点)に近づきすぎない限り、うまく機能します。動きが速すぎるとスピンがさらに回転し、原点に近づくと予期しない方向転換が発生します。
このコードを修正するにはどうすればよいですか?マウスポイントの変更だけで速度を把握し、それに基づいて回転を更新できるため、マウスがどちらの方向(時計回りまたは反時計回り)に移動しているかを知る必要があります。
これに関連するトピックには、文字通り数十のSOスレッドがあります(ピボットポイントから回転した後の長方形の方向(角度)を取得する方法、マウス座標から基本的なマウスの方向を取得する方法、回転した要素をの方向に移動するJavaScriptでのローテーション)-しかし、私は完全には理解していなかったクロス積を必要とするこれについて言及している1つのコメントを除いて、この質問に答えることができるものを見つけることができませんでした。