Заполнение плоскости треугольниками (триангуляция)

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

введите здесь описание изображения

Что должна делать программа?

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

Алгоритмы, которые я пробовал до сих пор:

1.

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

2.

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

    введите здесь описание изображения

3.

  • Сделать случайные точки
  • Сделайте все возможные соединения (каждая точка с каждой другой)
  • Сортировка соединений по длине
  • Для каждого соединения, начинающегося с самой короткой линии, если она не пересекается ни с одной другой линией. В противном случае удалите соединение.

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

введите здесь описание изображения

Я не нашел способа узнать, какие соединения образуют треугольник, и поэтому я не мог раскрасить их независимо...

Так что, надеюсь, вы знаете, как создать хороший холст с треугольниками, как на первой картинке, и дайте мне знать...


person Anton Ballmaier    schedule 04.07.2017    source источник
comment
Не могли бы вы установить одну точку, нарисовать, например. 4 случайным образом вокруг и соедините их со средним и вокруг, затем повторите с другими точками.   -  person Jonas Wilms    schedule 04.07.2017
comment
Google Триангуляция Делоне.   -  person meowgoesthedog    schedule 04.07.2017
comment
В дополнение к предложению @spug: триангуляции Делоне обладают тем свойством, что они максимизируют наименьший угол любого треугольника, то есть они избегают создания длинных узких треугольников (когда это возможно).   -  person j_random_hacker    schedule 04.07.2017
comment
Чтобы быть педантичным, пример изображения не является триангуляцией Делоне, поэтому это не приведет к получению изображения, подобного приведенному ниже, если это важно.   -  person samgak    schedule 05.07.2017
comment
@samgak Ну, все, что я хочу, это хорошо выглядеть ... для этого должна работать триангуляция Делоне :)   -  person Anton Ballmaier    schedule 05.07.2017


Ответы (1)


Хорошим решением будет начать со случайных точек (с вашим предпочтительным распределением) и применить алгоритм триангуляции. . Среди них хорошим кандидатом является триангуляция Делоне из-за ее низкой вычислительной сложности и доступности кода.

person Yves Daoust    schedule 04.07.2017
comment
Я благодарен за подсказку, но я не думаю, что это решает мою проблему с сохранением каждого отдельного треугольника как объекта, чтобы иметь возможность в конечном итоге их раскрасить... - person Anton Ballmaier; 05.07.2017
comment
@AntonBallmaier: ты ошибаешься, если так думаешь. Алгоритм триангуляции может позволить вам перечислить все грани и создать треугольник для каждой. - person Yves Daoust; 05.07.2017
comment
Ну, тогда большое спасибо за совет :) О, и возьми те 15 респ. :П - person Anton Ballmaier; 05.07.2017