頂点を線で結ぶシステムがあります。それ自体と「次の」ポイントを比較して、各頂点の角度を測定します (頂点は二重にリンクされたリストです)。
var next = this.get("next"),
dX = next.get("x") - this.get("x"),
dY = next.get("y") - this.get("y"),
radians = Math.atan2(dY, dX);
それらの間のこの角度が、45 度から +/- 2 度のようなしきい値に達したとき... 47 度のように、45 と呼びたいです... この点を x、y に移動する必要があります。 45度だったはずです。これと同じことが 135、90、180 などにも当てはまります。
角度と、45 度にスナップするゾーン内にあるかどうかを簡単に検出でき、どの角度に設定する必要があるかがわかります。見つける方法がわからないのは、その新しい角度が与えられた x、y です。
if(CLOSE_ENOUGH_TO_SNAP) {
newAngle = Math.round(angle / 45) * 45;
this.set({
x: something,
y: something
});
}
したがって、下の画像では、この角度は 90 にスナップする必要があるため、92 ではなく 90 であることを考えると、新しい x、y を計算できるはずです。