Chaos Игра представляет собой простой метод для генерации фракталов. Учитывая начальную точку, отношение длины r и набор 2D точек, многократно выполните следующее:
- Из вашего набора точек, выберите один наугад (равномерно).
- Усредните эту точку и последнюю нарисованную точку (или начальную точку), используя r и 1 - r в качестве весов (т.е. r = 0 означает, что вы получили начальную точку, r = 1 означает, что вы получили случайную точку, а r = 0,5 означает, что вы получить точку на полпути между ними.)
- Нарисуйте результирующую точку.
Например, если вы выбрали вершины равностороннего треугольника и r = 0,5 , построенные точки отобразили бы треугольник Серпинского:
Изображение найдено в Википедии
Вы должны написать программу или функцию, которая «играет» в игру хаоса, чтобы создать фрактал.
вход
Вы можете написать либо программу, либо функцию и получить следующие входные данные через ARGV, STDIN или аргумент функции:
- Количество точек на графике.
- Начальная координата (которая также должна быть нанесена!).
- Усредняющий вес r в интервале [0,1] .
- Список точек на выбор.
Выход
Вы можете визуализировать на экране или написать файл изображения. Если результат растеризован, он должен быть не менее 600 пикселей с каждой стороны, все точки должны быть на холсте, и по крайней мере 75% горизонтального и вертикального экстента изображения должны использоваться для точек (это нужно для того, чтобы избежать отвечает одним черным пикселем, говоря: «Это действительно сильно уменьшено»). Оси x и y должны быть в одном масштабе (то есть линия от (0,0) до (1,1) должна быть под углом 45 градусов), и каждая точка, изображенная в игре хаоса, должна быть представлена как одна pixel (если ваш метод построения графика сглаживает точку, она может быть растянута на 2x2 пикселя).
Цвета - ваш выбор, но вам нужно по крайней мере два различимых цвета: один для фона и один для точек, построенных во время игры в хаос. Вы можете, но не обязательно наносить на график точки ввода.
Пожалуйста, включите три интересных примера выходных данных в свой ответ.
счет
Это код гольф, поэтому самый короткий ответ (в байтах) выигрывает.
Изменить: вам больше не нужно наносить точки ввода, так как они все равно не видны как отдельные пиксели.
источник
Ответы:
Математика, 89
Как это работает
В Mathematica
Graphics[]
функция производит масштабируемую графику, вы визуализируете ее в любом размере, просто перетаскивая углы изображения. Фактически, исходный размер всей отображаемой графики - это настройка «.ini», которую вы можете установить на 600 или на любое другое значение, которое вы пожелаете. Поэтому нет необходимости делать что-то особенное для требования 600x600.Дело в
AbsolutePointSize[]
том, что размер точки не будет изменяться при увеличении размера изображения.Основная конструкция
или в псевдокоде без игры в гольф:
Это рекурсивное построение списка, начиная с
(start point)
и применяя (векторную) функцию в первом аргументе к каждой последующей точке, в конечном итоге возвращая список всех вычисленных точек, которые будут построеныPoint[]
Некоторые примеры самовоспроизведения:
источник
Instructions for testing this answer without Mathematica installed:
1) Загрузите это из pastebin и сохраните как * .CDF 2) Загрузите и установите бесплатную среду CDF от Wolfram Research по адресу (не маленький файл). Наслаждаться. Скажи мне, если это работает!#r
чтобыr#
уйти без пробела или*
между ними.#
иr
.#key
. Я уверен, что это пригодится. :)Ява: 246
253447Как функция
m()
:Разрывы строки (в программе, чтобы показать использование):
Отрисовка входных точек была удалена из требований (yay 80 байт!). Они все еще показаны на старых скриншотах ниже, но не появятся, если вы запустите их. Смотрите историю изменений, если интересно.
Входные данные приведены в виде массива с плавающей точкой. Первая - это итерации, следующие две начинаются
x y
. Четвертый - этоr
, наконец,x1 y1 x2 y2 ...
модный список координат .Ниндзя звезда
Пересекать
Octochains
источник
show
устарелиshow()
является устаревшим, но он все еще работает. Когда вы говорите «не работает», что это значит? Если у вас нет Java 8, вам нужно добавитьfinal
кString[]a
в основном , по крайней мере.JavaScript (E6) + HTML 173
176 193Изменить: большой вырез, благодаря Уильяму Барбозе
Изменить: 3 байта меньше, благодаря DocMax
173 байта, считающие функцию и элемент холста, необходимые для отображения выходных данных.
Тест сохраните как HTML-файл и откройте в FireFox.
JSFiddle
источник
<canvas id=C><script>F=(n,x,y,r,p)=>{t=C.getContext("2d"),C.width=C.height=600;for(;n--;)t.fillRect(x,y,1,1),i=Math.random()*p.length&~1,x-=(x-p[i])*r,y-=(y-p[i+1])*r}</script>
длиной 176 байт, я не понял твой счетfor
вызове:for(C.width=C.height=600;n--;y-=(y-p[i+1])*r)
Питон -
200189Принимает ввод как аргументы функции для a, записывает результат в stdout в виде файла pgm.
n
это итерации,s
это начальная точка,r
это r, иz
это список входных точек.Редактировать: больше не рисует точки ввода серым цветом.
Интересные выводы:
источник
p=[255]*360000
могут быть необязательными параметрами для функции; тело цикла for может идти по одной и той же строке, если у него нет потока управления; Вы можете сбрить Parens от[1]*(n+1)
как[1]*-~n
; так как вы не используетеi
в наружном цикл, он короче запустить код наn
раз , какexec"code;"*n
); Я думаю, что параныfor i in(0,1)
могут быть удалены.Суперколлайдер - 106
SuperCollider - это язык для создания музыки, но он может создавать графику в крайнем случае.
Я использовал некоторые неясные сочетания клавиш для сохранения нескольких байтов - более читаемая и более эффективная память
на 109 символов.
Как и в примере с Mathematica, вы должны вручную изменить размер окна, чтобы получить 600x600 пикселей. Вы должны ждать, пока он перерисовывается, когда вы делаете это.
Это создает базовый треугольник Серпинского (не показан, потому что вы видели его раньше)
Это делает своеобразную вещь типа Серпинского пятиугольника:
То же самое с 6 очками оставляет перевернутую снежинку Коха в середине:
Наконец, вот рифф на 3D-пирамидах из ответа туза. (Обратите внимание, что я использовал одну из точек дважды, чтобы получить эффект затенения.)
источник
Питон,
189183175Изменить: исправил перевернутый г отношение и переключился изображение, чтобы сохранить несколько байтов.
Принимает количество точек как
n
, первая точка какp
, соотношение какr
и список точек какl
. Нужен модуль Подушка.Примеры:
Я генерирую точки по кругу вокруг центра изображения
XOXO повторений, просто меняя соотношение с 0,4 на 0,6
Какая-то снежинка
источник
n,p,r,l=input()
. Вы также можете снять скобки с*=
операций и использованияimport random as R
.*=
. :( Theinput
вещи будет хорошо быть очень неприятно работать, а импорт в настоящее время является наиболее краткой формой можно (или я что - то пропустил?).import random as R,PIL.Image as I
а затемrandom.choice
может бытьR.choice
. Да, использование ввода неэффективно, но вы можете использовать версию функции для тестирования и опубликовать ееinput()
для лучшего результата !! 1! : Py=x*(1-r)+w
==y=x-x*r-w
.JavaScript
(407)(190)Я рад получить любые отзывы о моем сценарии и о гольфе, так как мне не нравится JS =) (не стесняйтесь использовать это / изменить его для собственного представления!)
Чтение ввода (чтобы быть сопоставимым с записью edc65 , я не считаю вход.):
Настройка и расчет холста
Несколько более незаметно (включая пример ввода, где реальные подсказки ввода только что закомментированы, поэтому готовы к использованию):
Примеры
источник
Обработка, 153
Портировал Java-ответ @Geobits на Processing и сделал еще несколько игр в гольф, что привело к сокращению на 100 символов. Первоначально я намеревался оживить процесс, но входные ограничения слишком жесткие для этого (в обработке нет stdin или argv, что означает, что я должен написать свою собственную функцию вместо использования собственного
draw()
цикла обработки).Полная программа с переносами строк:
Выше программа дает крестики:
Это дает Пирамиды:
Это дает треугольник Серпинского:
источник
Ungolfed "эталонная реализация", Python
Обновить : намного, намного быстрее (на порядок)
Проверьте интерактивную оболочку!
Отредактируйте файл и установите
interactive
дляTrue
, затем выполните одно из следующих действий:polygon numberOfPoints numeratorOfWeight denominatorOfWeight startX startY numberOfSides
генерирует, сохраняет и отображает многоугольник.points numberOfPoints numeratorOfWeight denominatorOfWeight startX startY point1X point1Y point2X point2Y ...
делает то, что требует спецификация.источник
Питон (202 символа)
Принимает количество точек как
n
, усредняющий вес какr
, начальную точку как atuple
s
и список точек как списокtuple
вызываемых XYl
.источник