У меня есть куча копланарных точек, определяющих многоугольник в трехмерном пространстве. Они всегда наматываются одинаково (например, по часовой стрелке). Мне нужно определить нормаль со знаком к плоскости, содержащей этот многоугольник, т. е. знать, какой путь находится «вверху» для этого многоугольника.
На первый взгляд это кажется достаточно простым: возьмите два ребра (разности вершин) и вычислите векторное произведение. Но это не работает, если края оказываются коллинеарными (вы получаете векторное произведение с нулевой величиной).
Затем я попытался пройтись по списку вершин, пока не нашел второе ребро, образующее достаточно большой угол с первым ребром. Это надежно работает на выпуклом многоугольнике, но может дать сбой (указать противоположное направление) на невыпуклом многоугольнике, если два ребра, которые я получаю, не определяют треугольник внутри многоугольника.
Я знаю, что если бы я сначала триангулировал многоугольник, то я мог бы легко и надежно проверить ориентацию любого треугольника... но проблема в том, что моя библиотека триангуляции требует знания нормали к плоскости. Итак, яйцо должно быть раньше курицы.
Как выбрать два ребра (или три вершины) в невыпуклом многоугольнике, чтобы надежно определить, в какую сторону обращен многоугольник?