Триангуляционное множество точек на произвольной плоскости в трехмерном пространстве

У меня есть набор точек в трехмерном пространстве. С максимальной ошибкой 10^-5 я могу разместить плоскость через них (ошибка - расстояние от точки до плоскости).

Есть ли способ триангулировать эти точки на этой произвольной плоскости? Я пробовал Бойера-Уотсона, но это работает только тогда, когда ошибка равна 0. Все остальное, и оно не будет триангулировать, или я не получу хорошую триангуляцию (перекрывающиеся треугольники).

редактировать

Я думаю, что нашел проблему. Под определенными углами алгоритм Бойера-Ватсона не будет работать, потому что мой расчет обводного центра отключен. Как я могу рассчитать центр окружности треугольника в 3D?

1 ответ

Решение

Так как я знаю точки на плоскости, я могу вычислить вектор. Этот вектор лежит на плоскости. Далее я вычисляю центр масс точек.

Используя вектор и центр масс, я могу создать большой треугольник на плоскости.

        Vertex p1 = new Vertex(dir * 3000 + center);
        Vertex p2 = new Vertex(Quaternion.AngleAxis(120, plane.normal) * dir * 3000 + center);
        Vertex p3 = new Vertex(Quaternion.AngleAxis(240, plane.normal) * dir * 3000 + center);

Теперь, когда у меня есть вмещающий треугольник, я могу просто использовать Бойера-Ватсона. Для кругового центра в 3D я использую:

Vector3 ac = p3 - p1;
    Vector3 ab = p2 - p1;
    Vector3 abXac = Vector3.Cross(ab, ac);

    circumceter = p1 + (Vector3.Cross(abXac, ab) * ac.sqrMagnitude + Vector3.Cross(ac, abXac) * ab.sqrMagnitude) / (2 * abXac.sqrMagnitude);

И теперь у меня есть триангулированный набор точек на произвольной плоскости в 3D.

Другие вопросы по тегам