我有一个顶点系统,连接它们的线条。我通过比较它自己和它的“下一个”点来测量每个顶点的角度(顶点是一个双向链表)。
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.
答案 0 :(得分:0)
in psuedocode:
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;
}