Вдохновленный vi.sualize.us
Цель
На входе изображение в градациях серого, а на выходе - черно-белое изображение. Выходное изображение состоит только из одной замкнутой кривой (петли), которая не может пересекаться с самим собой или касаться себя. Ширина линии должна быть постоянной по всему изображению. Задача здесь - найти алгоритм для этого. Выходные данные просто должны представлять входное изображение, но с любой художественной свободой. Разрешение не так важно, но соотношение сторон должно оставаться примерно таким же.
пример
Больше тестовых изображений
The width of the line shall be constant throughout the whole image.
Но все же полезныйОтветы:
Java: стиль матрицы точек
Так как никто еще не ответил на вопрос, я попробую. Сначала я хотел заполнить холст кривыми Гильберта, но в итоге я выбрал более простой подход:
Вот код:
Обновление : теперь он создает цикл, а не просто одну строку
источник
Питон: кривая Гильберта (
373361)Я решил нарисовать кривую Гильберта с переменной зернистостью в зависимости от интенсивности изображения:
На самом деле я планировал принимать решения на разных уровнях детализации, например: «Это место настолько яркое, что я остановлю рекурсию и перейду к следующему блоку!». Но оценка интенсивности изображения, локально приводящая к большим движениям, очень неточна и выглядит некрасиво. Так что я решил только пропустить 1-й уровень или нарисовать еще один цикл Гильберта.
Вот результат на первом тестовом изображении:
Благодаря @githubphagocyte рендеринг довольно быстрый (используется
turtle.tracer
). Таким образом, мне не нужно ждать всю ночь для результата и я могу пойти в свою заслуженную кровать. :)Какой-то код гольф
@flawr: "короткая программа"? Вы не видели версию для гольфа! ;)
Так просто ради интереса
(
373361 символов. Но это займет вечность, так как я удаляюturte.tracer(...)
команду!)Анимация от flawr
flawr: Мой алгоритм немного изменен в соответствии с тем, что @DenDenDo сказал мне: мне приходилось удалять некоторые точки в каждой итерации, потому что конвергенция резко замедлялась. Вот почему кривая будет пересекать себя.
источник
screen.tracer(0)
вместоturtle.speed(0)
. Возможно, вам придется создать экземпляр экрана в начале, но если это единственный экземпляр экрана, все ваши черепахи будут автоматически назначены на него. Тогда как разscreen.update()
в конце отображаются результаты. Я был поражен разницей в скорости, когда впервые обнаружил это ...Python 3.4 - проблема коммивояжера
Программа создает размытое изображение из оригинала:
Для каждого черного пикселя случайно генерируется точка рядом с центром пикселя, и эти точки рассматриваются как задача коммивояжера . Программа регулярно сохраняет html-файл, содержащий изображение SVG, при попытке уменьшить длину пути. Путь начинается самопересекающимся и постепенно уменьшается в течение нескольких часов. В конце концов, путь больше не является самопересекающимся:
Программа использует 3 различных подхода к улучшению решения и измеряет производительность в секунду для каждого. Время, выделенное для каждого подхода, корректируется, чтобы дать большую часть времени тому подходу, который наиболее эффективен в то время.
Сначала я попытался угадать, какую долю времени выделять для каждого подхода, но оказалось, что наиболее эффективный подход значительно варьируется в ходе процесса, поэтому большое значение имеет автоматическая корректировка.
Три простых подхода:
Для подхода 3 используется сетка, в которой перечислены все линии, которые проходят через данную ячейку. Вместо того, чтобы проверять каждую линию на странице на предмет пересечения, проверяются только те, которые имеют общую ячейку сетки.
Я получил идею использовать проблему коммивояжера из поста в блоге, который я видел до публикации этого вызова, но я не смог отследить его, когда опубликовал этот ответ. Я полагаю, что изображение в задании было получено с использованием подхода коммивояжера, в сочетании с некоторым сглаживанием траектории для устранения резких поворотов.
Я до сих пор не могу найти конкретный пост в блоге, но теперь нашел ссылку на оригинальные статьи, в которых Мона Лиза использовалась для демонстрации проблемы коммивояжера .
Реализация TSP здесь представляет собой гибридный подход, с которым я экспериментировал для удовольствия от этой задачи. Я не читал связанные газеты, когда я отправил это. Мой подход мучительно медленный по сравнению. Обратите внимание, что мое изображение здесь использует менее 10000 точек и занимает много часов, чтобы сойтись достаточно, чтобы не было пересечений. Пример изображения в ссылке на статьи использует 100 000 баллов ...
К сожалению, большинство ссылок сейчас, кажется, мертвы, но работа Крэйга С. Каплана и Роберта Боша «TSP Art» 2005 года все еще работает и дает интересный обзор различных подходов.
источник
Ява - Колебания
Программа рисует замкнутый контур и добавляет колебания, амплитуда и частота которых зависят от яркости изображения. «Углы» пути не имеют колебаний, чтобы убедиться, что путь не пересекает себя.
Ниже приведен сопоставимый алгоритм, основанный на спирали. ( Я знаю, что путь не закрывается и что он, конечно, пересекается , я просто публикую его ради искусства :-)
источник
Java - рекурсивный путь
Я начинаю с закрытого пути 2х3. Я сканирую каждую ячейку пути и делю ее на новый подпуть 3х3. Я стараюсь каждый раз выбирать подпуть 3х3, который «выглядит» как исходное изображение. Я повторяю вышеописанный процесс 4 раза.
Вот код:
источник