2013-07-26 3 views
1

У меня есть система вершин с линиями, соединяющими их. Я измеряю угол в каждой вершине, сравнивая себя, и это «следующая» точка (вершины представляют собой двусвязный список).Рисунок x, y точки после угла выдержки?

var next = this.get("next"), 
    dX = next.get("x") - this.get("x"), 
    dY = next.get("y") - this.get("y"), 
    radians = Math.atan2(dY, dX); 

Когда этот угол между ними попадает некоторый порог, как +/- 2 градусов от 45 градусов ... так как 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, и поэтому я должен быть в состоянии вычислить новый х, у, учитывая, что это 90, а не 92.

enter image description here

+0

, где есть образ? – Guanxi

+0

Должен быть там сейчас - извините, забыл приложить. – oooyaya

+0

может помочь указать, что если этот угол был C на треугольнике, я знаю точки A и B и длину ноги AB, но я не знаю, как долго будут AC и BC. – oooyaya

ответ

0

в 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, вы могли бы избежать использования греха и соз.

Для кратного 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; 
} 
+0

Возможно ли это, если я не знаю расстояние/длину сегмент? – oooyaya

+0

У вас есть две координаты, верно? Если это так, то можно вычислить расстояние, используя теорему pythagorean. Это то, что делает вторая строка с квадратным корнем. –

Смежные вопросы