2017-02-13 19 views
2

Я создаю карту и вычисляю угол линий, чтобы определить ориентацию дороги (NSEW).Вычислить угол линии с отрицательным наклоном

Ниже формула я использую, чтобы вычислить угол линии:

Math.tan(slope)/(Math::PI/180)

Это работает до тех пор, наклон моей линии не является отрицательным. Как правильно рассчитать угол линии с отрицательным наклоном?

Update Чтобы вычислить угол линии, я сейчас с помощью

Math.atan2(delta_y, delta_x)/(Math::PI/180) 

Проблема, кажется, проистекают из которых указывает подбираю линия начинается/заканчивается. В зависимости от того, какой я беру, некоторые верны, некоторые - нет, и наоборот. Вот изображение карты я создаю:

enter image description here

Я только пытаюсь вычислить угол линий, которые пересекаются с кадрирования. Одна из точек всегда там, где линия пересекается с ограничивающим прямоугольником, другая точка всегда только после этого.

Мое начало (0,0) находится в верхнем левом углу.

+3

Имеет ли язык, на котором вы программируете, функцию 'Math.atan2 (y, x)'? Это даст вам правильное значение во всех четырех квадрантах. –

+0

@AndrewMorton. Я использую Ruby. Будет ли 'y = (y1 - y2)' и 'x = (x1-x2)'? – theartofbeing

+0

@AndrewMorton so '(Math.atan2 (delta_y, delta_x)/(Math :: PI/180))' - Кажется, я не получаю правильный угол. Да на 'E = 0, N = 90, W = 180, S = 270' – theartofbeing

ответ

0

Я смог решить это, выполнив следующее. Имейте в виду, что это инвертированная ось, где начало (0, 0) находится в верхнем левом углу.

def angle(point1, point2) 
    return 90 if vertical?(point1, point2) 
    return 0 if horizontal?(point1, point2) 
    point1, point2 = [point1, point2].sort_by(&:x) 
    delta_x = point1.x - point2.x 
    delta_y = point1.y - point2.y 

    if point1.y > point2.y # inverted axis/origin 
    Geometry.to_degrees(Math.atan(delta_y/delta_x)).abs 
    else 
    # Add 90 degrees when angle is in 3rd quadrant 
    Geometry.to_degrees(Math.atan(delta_x/delta_y)).abs + 90 
    end 
end 
Смежные вопросы