Вычисление внешнего угла в вершине многоугольника - PullRequest
1 голос
/ 02 апреля 2012

Эй, ребята, это небольшая домашняя головоломка, над которой я работаю, и мой триггер не слишком силен, так что терпите меня.

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

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

            double dx21 = one.x - two.x;
            double dx31 = three.x - two.x;
            double dy21 = one.y - two.y;
            double dy31 = three.y - two.y;
            double m12 = Math.sqrt(dx21*dx21 + dy21*dy21);
            double m13 = Math.sqrt(dx31*dx31 + dy31*dy31);
            double theta = Math.acos((dx21*dx31 + dy21*dy31)/ (m12 * m13));

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

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

Я знаю, что это в основном математический вопрос, но любой совет был бы очень полезен.

1 Ответ

2 голосов
/ 02 апреля 2012

Вот несколько примечаний.

Во-первых, внешний угол, как его обычно определяют, будет 180 градусов - внутренний угол, или пи - внутренний угол, в зависимости от ваших единиц измерения.Смотрите здесь .Быстрая проверка работоспособности состояла бы в том, чтобы сложить внешние углы вместе, чтобы убедиться, что вы получите круг.

Во-вторых, вы можете это знать, но я должен отметить, что Math.acos возвращает угол в радианах, а не в градусах.

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

Наконец, перейдя к вашему вопросу, вот подсказка: вы смотрите на векторы из p2-> p1 и p2-> p3;когда я прочитал проблему, я изобразил каждый вектор из p1-> p2 и p2-> p3.Либо один из них является вполне приемлемым способом решения проблемы, но подумайте о том, как различны углы между этими парами векторов и как это связано с вашей проблемой.

...