2013-03-28 1 views
6

Я хотел бы создать простое приложение C++, которое, учитывая 100 случайных точек (с их выпуклой оболочкой), будет триангулировать облако этих точек. Я искал эту тему, и я вижу, что триангуляция Delaunay - это вариант, но я все еще не могу понять, как это реализовать (например, в C++). Также на следующем уровне я хотел бы нарисовать все «незаконные» треугольники Delaunay другим цветом, чтобы лучше показать и понять алгоритм Делоне.Точки облака Алгоритм триангуляции

Может ли кто-нибудь помочь мне понять, как триангулировать эти точки? Может быть, небольшая часть кода или вообще алгоритм, который мне нужно реализовать?

+0

Это не вопрос о кодировании, а о триангуляции. – Walter

+0

, но меня интересуют как триангуляция, так и ее кодирование. –

ответ

4

Я думаю, вам нужна общая триангуляция в первую очередь, а затем исправить все, что не является Делоне-законным?

очень плохой алгоритм триангуляции (с плохим углом вектором) выходит что-то вроде этого:

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

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

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

Если вы обнаружили проблемы с его реализацией, я мог бы предоставить несколько примеров кода, чтобы вы начали. Теперь имейте в виду, что возвращаемое значение алгоритма было бы удобным быть множеством/вектором треугольников; таким образом вы можете манипулировать ими и изменять свой цвет индивидуально.

7

Я сильно предложить не кодирования любой алгоритм триангуляции Делоне с нуля. Если бы я делал это, чтобы получить интуитивное понимание того, как выглядит результат алгоритма, я бы взял Johnathan Shewchuk's Triangle code и изменил его, чтобы назначить разные цвета и т. Д.

Если, однако, вы достаточно мотивированы, чтобы реализовать это с нуля , тогда мое предложение состояло бы в том, чтобы сначала реализовать триангуляцию 2D Delaunay, прежде чем заниматься 3D-версией.

+0

благодарим вас за ответ и время! во-первых, я хочу просто триангулировать эти 100 баллов. есть ли простой и всеобъемлющий способ сделать это?Я видел алгоритмы, такие как ушные обрезки и т. Д., Но я все еще не могу их понять (или реализовать их в C++). –

+0

Если вы хотите только триангулировать эти 100 баллов, можете ли вы использовать программное обеспечение, написанное кем-то еще? Если да, то посмотрите на это: http://www.codeproject.com/Articles/492435/Delaunay-Triangulation-For-Fast-Mesh-Generation (я также нашел сообщение StackOverflow, в котором обсуждались Delaunay и Voronoi: http: // stackoverflow .com/a/9240121/1384030) –

+0

Я не хочу использовать готовое решение, потому что мне нужно узнать это, закодировав его. Если у вас есть что предложить, я буду рад! Спасибо, до сих пор! –

3

Если вы хотите узнать об обоих алгоритмов триангуляции и их кодирования в C++, то объединенный проект кодирования триангуляции в C++ может показаться заманчивым, но это, конечно, слишком сложно для новичка. Поэтому я предлагаю вам первых узнать о алгоритмических аспектах триангуляции и основыC++ отдельно, прежде чем решать комбинированные задачи.