Угол в углу двух линий - PullRequest
2 голосов
/ 13 июня 2009

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

Вот иллюстрация:

illustration

Теперь я знаю, что могу вычислить углы между двумя векторами A-B и C-B, которые включают в себя скалярное произведение, нормализацию и косинус. Тогда мне все равно придется определить, какой из двух полученных углов (второй - 180 градусов минус первый), я хочу взять два раза, добавленных к другому.

Однако я подумал, что может быть гораздо более простое и менее хитрое решение, возможно, с использованием функции могущественного atan2 (). Я застрял и спросил вас об этом: -)

UPDATE: Меня спросили, для чего мне нужен угол. Мне нужно вычислить площадь этого конкретного круга вокруг B, но только для многоугольника, который описывается A, B, C, ... Итак, чтобы вычислить площадь, мне нужен угол, чтобы использовать формулу 0.5*angle*r*r.

Ответы [ 4 ]

5 голосов
/ 13 июня 2009

Используйте внутреннее произведение (точечное произведение) векторов, описывающих линии, чтобы получить внутренний угол и вычесть из 360 градусов?


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

Принимая . за точечный продукт, который мы имеем

 v . w = |v| * |w| * cos(theta)

, где v и w - векторы, а theta - угол между линиями. И скалярное произведение может быть вычислено из компонентов векторов как

 v . w = SUM(v_i * w_i : i=0..3) // 3 for three dimensions. Use more or fewer as needed

здесь индексы обозначают компоненты.


На самом деле прочитайте вопрос:

  • Угол, возвращаемый при инвертировании точечного произведения, всегда будет меньше 180 градусов, поэтому это всегда внутренний угол.
3 голосов
/ 13 июня 2009

Используйте эту формулу:

beta = 360° - arccos(<BA,BC>/|BA||BC|)

Где <,> - скалярное произведение, а BA (BC) - векторы от B до A (B до C).

2 голосов
/ 13 июня 2009

Мне нужно вычислить площадь круга за пределами многоугольника, который описывается как A, B, C, ...

Звучит так, будто вы выбрали неправильный подход. Вам необходимо вычислить площадь окружности , затем вычесть площадь многоугольника.

1 голос
/ 13 июня 2009

Если вам нужен угол, то нет способа нормализовать векторы и сделать точку или перекрестное произведение. У вас часто есть выбор, хотите ли вы рассчитать угол с помощью asin, acos или atan, но в итоге это не влияет на скорость выполнения.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...