Авторы благодарности Calvin's Hobbies за продвижение моей идеи в правильном направлении.
Рассмотрим набор точек на плоскости, которые мы будем называть сайтами , и сопоставьте цвет каждому сайту. Теперь вы можете раскрасить всю плоскость, окрасив каждую точку цветом ближайшего участка. Это называется картой Вороного (или диаграммой Вороного ). В принципе, карты Вороного могут быть определены для любой метрики расстояния, но мы просто будем использовать обычное евклидово расстояние r = √(x² + y²)
. ( Примечание. Вам не обязательно знать, как рассчитать и отобразить один из них, чтобы участвовать в этом соревновании.)
Вот пример с 100 сайтами:
Если вы посмотрите на любую ячейку, то все точки в этой ячейке будут ближе к соответствующему сайту, чем к любому другому сайту.
Ваша задача - аппроксимировать данное изображение такой картой Вороного. Вам дают изображение в любом удобном формате растровой графики, а также целое число N . Затем вы должны создать до N сайтов и цвет для каждого сайта, чтобы карта Вороного, основанная на этих сайтах, максимально приближалась к исходному изображению.
Вы можете использовать Фрагмент стека в нижней части этого задания, чтобы визуализировать карту Вороного из вашего вывода, или вы можете сделать это самостоятельно, если хотите.
Вы можете использовать встроенные или сторонние функции для вычисления карты Вороного из набора сайтов (если вам нужно).
Это конкурс популярности, поэтому победит ответ с наибольшим количеством голосов. Избирателям предлагается судить ответы по
- насколько хорошо исходные изображения и их цвета приблизительны.
- насколько хорошо алгоритм работает на разных видах изображений.
- насколько хорошо работает алгоритм для малых N .
- может ли алгоритм адаптивно кластеризовать точки в тех областях изображения, которые требуют более подробной информации.
Тестовые изображения
Вот несколько изображений для проверки вашего алгоритма (некоторые из наших обычных подозреваемых, некоторые новые). Нажмите на картинку для увеличения.
Пляж в первом ряду нарисовал Оливия Белл и включил с ее разрешения.
Если вам нужен дополнительный вызов, попробуйте Йоши с белым фоном и нарисуйте правильную линию живота.
Вы можете найти все эти тестовые изображения в этой imgur галерее, где вы можете скачать их все в виде zip-файла. Альбом также содержит случайную диаграмму Вороного в качестве еще одного теста. Для справки, вот данные, которые его сгенерировали .
Пожалуйста, включите примеры диаграмм для различных изображений и N , например, 100, 300, 1000, 3000 (а также вставки для некоторых из соответствующих спецификаций ячеек). Вы можете использовать или опускать черные края между ячейками по своему усмотрению (это может выглядеть лучше на некоторых изображениях, чем на других). Не включайте сайты (за исключением, например, отдельного примера, если, конечно, вы хотите объяснить, как работает размещение вашего сайта).
Если вы хотите показать большое количество результатов, вы можете создать галерею на imgur.com , чтобы размер ответов был разумным. В качестве альтернативы, поместите миниатюры в свое сообщение и сделайте их ссылками на большие изображения, как я сделал в своем справочном ответе . Вы можете получить маленькие миниатюры, добавив s
имя файла в ссылку на imgur.com (например, I3XrT.png
-> I3XrTs.png
). Кроме того, не стесняйтесь использовать другие тестовые изображения, если вы найдете что-то хорошее.
Renderer
Вставьте свой вывод в следующий фрагмент стека, чтобы отобразить результаты. Точный формат списка не имеет значения, если в каждой ячейке заданы 5 чисел с плавающей запятой в порядке x y r g b
, где x
и y
- это координаты сайта ячейки, а r g b
также красный, зеленый и синий цветовые каналы в диапазоне 0 ≤ r, g, b ≤ 1
.
Фрагмент предоставляет опции для указания ширины линии краев ячейки и того, должны ли показываться сайты ячейки (последний в основном для целей отладки). Но обратите внимание, что выходные данные повторно отображаются только при изменении спецификаций ячеек - поэтому, если вы измените некоторые другие параметры, добавьте пробел в ячейки или что-то еще.
Огромные благодарности Раймонду Хиллу за написание этой действительно хорошей библиотеки JS Voronoi .