1

頂点を線で結ぶシステムがあります。それ自体と「次の」ポイントを比較して、各頂点の角度を測定します (頂点は二重にリンクされたリストです)。

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 を計算できるはずです。

ここに画像の説明を入力

4

1 に答える 1

0

疑似コードで:

point dif = currentPt - previousPt

float distance = sqrt(dif.x * dif.x + dif.y * dif.y)

float newCurrentX = previousPt.x + distance * cos(newAngle)

floar newCurrentY = previousPt.y + distance * sin(newAngle)

ただし、すべての新しい角度が 45 の倍数である場合は、sin と cos の使用を避けることができます。

90 度 (または 0 度) の倍数の場合、

if (newAngle is 90) newCurrentY = previousPt.y + distance 
else if (newAngle is 0) newCurentX = previousPt.x + distance,
 etc.

45 度の倍数の場合:

else if (newAngle is 135) { 
 shift = distance * CONST_SIN_OF_45; 
 newCurrentX = previousPt.x - shift; 
 newCurrentY = previousPt.y + shift; 
}
于 2013-07-26T20:00:19.370 に答える