Найти степень на пересечении векторов в выпуклом многоугольнике - PullRequest
0 голосов
/ 25 марта 2012

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

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

Вот мой код

double dx21 = one.x - two.x;
        double dx31 = one.x - three.x;
        double dy21 = one.y - two.y;
        double dy31 = one.y - three.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));
        System.out.println(theta);
        System.out.println(Math.toDegrees(theta));

Есть что-нибудь ослепительно очевидное, что я пропустил? Я пересекаю вершины против часовой стрелки, потому что так устроено множество.

1 Ответ

2 голосов
/ 25 марта 2012

Ваш код использует точку 'one' в качестве центральной точки, а затем вычисляет угол между 'two' и 'three'.Итак, если вы введете в вершинах (0,0), (0,10), (10,0), вы получите угол 90. Фактический расчет в порядке и работает, вы просто испортили порядок вершиндо.

...