как определить угол поворота многоугольника

Я пишу программу (.net) для создания макета в стиле стадиона, и мне нужно определить угол поворота для каждого многоугольника по сравнению с горизонталью.

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

Учитывая приведенное ниже изображение в качестве примера для имитации каждого варианта направления взгляда (обозначенного красной линией), как я могу определить угол поворота, необходимый для получения формы с красной линией сверху, как уже показано фигурой 5.

http://i40.tinypic.com/16ifhoo.gif   альтернативный текст

Я нашел логику для определения угла точек, составляющих красную линию, но мне также нужно знать поворот, чтобы вернуть ее в горизонтальное положение.

Я не уверен, нужна ли мне какая-то центральная точка отсчета для всех полигонов, чтобы помочь.

Как я могу лучше всего решить это?


person mimix    schedule 24.03.2009    source источник


Ответы (3)


Если вы знаете угол красной линии для некоторого многоугольника (скажем, a), то этот многоугольник находится по ту или иную сторону от этой линии. Так:

  • Use the average colour of some pixels near the line on both sides to determine which is the case.
    • If the polygon is above the line, the rotation angle is 180+a.
    • Если многоугольник находится ниже линии, угол поворота равен a.

где верх и низ соответствуют стороне с меньшим углом и сторонам с большим углом в зависимости от того, как вы измеряете a.

person Phil H    schedule 24.03.2009
comment
эти мысли помогли мне найти решение (вместе со сном). Дана ось x/y, если угол красной линии a равен: 0‹a‹90 — нижний правый угол (6) 90‹a‹180 — верхний правый угол (8) 180‹a‹270 — верхний левый угол (2) 270‹a‹ 360 - внизу слева (4) для 1 и 5. Я проверяю координаты Y, чтобы определить 180-й переключатель, как вы предложили. и координаты X для 3 и 7. Благодарность! - person mimix; 25.03.2009
comment
Без проблем. Одна вещь, которую следует учитывать, это то, как это может измениться в будущем — различные формы и настройки стадиона (например, несколько рядов сидений). Должен ли ваш код справляться с этим? - person Phil H; 25.03.2009
comment
абсолютно. это был просто пример. Я думаю, что это все равно справится, так как я хочу только определить поворот контура, чтобы я мог применить то же самое к содержимому/местам. Конечно, идеальным был бы хороший САПР с определенными местами для ссылки ... но это более сложная задача для бизнеса. - person mimix; 25.03.2009

Я бы попытался вычислить векторы нормалей на каждой красной линии (например, 0 градусов для многоугольника 5, 45 градусов для 4, 90 градусов для 3 и т. д.), а затем угол, на который нужно повернуть эту нормаль, и, таким образом, соответствующий многоугольник - так что нормальная "точка вверх" должна быть очень простой.

К сожалению, у меня нет необходимых формул, доступных для вас, но я думаю, что поиск в Google «нормального вектора» и / или поиск его в Википедии должен помочь вам начать работу. Возможно, в направлении так называемого «перекрестного произведения».

Для этого не нужна центральная опорная точка для всех полигонов (направление нормалей не связано с абсолютными координатами).

person peSHIr    schedule 24.03.2009

Функции sin, cos, tan позволяют преобразовать соотношение сторон треугольника в градусы.

Представьте, что один конец красной линии находится в точке (x1,y1), а другой — в точке (x2,y2). Вы можете рассматривать красную линию как гипотенузу прямоугольного треугольника и использовать арктангенс для получения градусов.

Соотношение между катетами составляет (x2-x1)/(y2-y1). Вращение красной линии равно arctan((x2-x1)/(y2-y1)). Остерегайтесь ситуаций, когда y1-y1 равно 0!

Давайте попробуем один пример с вашей картинки, многоугольник 6 с координатами (55, 65) и (65, 55). Наберите в гугле: "arctan((65-55)/(55-65)) в градусах"

person Pēteris Caune    schedule 24.03.2009
comment
Остерегайтесь ситуаций, когда y1-y1 равно 0 - для этого (среди прочего) хороша функция ATan2! - person Dan Byström; 24.03.2009