Вопрос

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

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

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

http://i40.tinypic.com/16ifhoo.gif alt text

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

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

Как я мог бы наилучшим образом решить эту проблему?

Это было полезно?

Решение

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

  • Используйте средний цвет некоторых пикселей вблизи линии с обеих сторон, чтобы определить, в каком случае дело обстоит именно так.
    • Если многоугольник находится над линией, угол поворота равен 180+a.
    • Если многоугольник находится ниже линии, поворот равен a.

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

Другие советы

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top