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,所以我应该能够计算一个新的 x,y,因为它是 90,而不是 92。

在此处输入图像描述

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 度(或零度)的倍数,

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 回答