Ваша задача - сгенерировать карту высот и показать ее в виде воксельной проекции с параллельной проекцией. Правила следующие:
- Пейзаж (карта высот) должен генерироваться случайным образом
- Вы также должны описать, как работает алгоритм, который вы используете, чтобы каждый мог узнать что-то новое здесь
- Вы также должны либо сгенерировать изображение, либо отобразить сгенерированный пейзаж на экране.
- Полученное изображение должно быть проецировано в параллельном направлении (то есть не в перспективе), и оно может содержать только воксели (поэтому оно должно быть сделано из маленьких коробок)
- Это конкурс популярности, поэтому вы можете добавить некоторые дополнительные функции в свою программу, чтобы получить больше голосов.
- Победителем считается наиболее верный и верный ответ через 7 дней после последней действительной подачи. Все действительные представления должны следовать правилам, включая описание используемого алгоритма. Вы можете добавить дополнительные функции, которые не следуют некоторым правилам (например, добавить режим перспективы), но в этом случае они должны быть дополнительными функциями (например, при их отключении результат должен следовать всем правилам)
- Мое представление не считается действительным.
Примерное изображение результата выглядит следующим образом:
Ответы:
3D-плоттер Python2 Voxel Edition
Это моя запись в этом конкурсе:
Как ясно указано в заголовке, он работает как плоттер 3D-функций, но, поскольку для этого соревнования требуется, чтобы ландшафт был случайным образом сгенерирован, это функция случайного синуса,
1.5*(math.sin(1/randA*x+randC)+math.sin(1/randB*y+randD))
которая зависит от 4 случайных величин. Это создает ландшафты как это:Мы можем, конечно, заменить эту случайную функцию на любую функцию с двумя переменными, например,
sin(sqrt((x/2)²+(y/2)²))*3
такую местность:и
-x*y*e^(-x^2-y^2)
дает это:(графики справа вычисляются вольфрам альфа)
И пока мы на этом, Риман Зета по критической полосе:
Для людей, которые не знакомы с ним, как вы можете видеть, эти лужи воды (которые представляют нули функции) все лежат на прямой линии (действительная часть = 0,5). Если вы сможете доказать это, вы получите $ 1000000! Смотрите эту ссылку.
Я надеюсь тебе это понравится!
источник
C #, WPF
Я экспериментировал со случайной прогулкой , которая работает лучше, чем я ожидал. Я начинаю где-нибудь на карте, иду к случайной соседней плитке и увеличиваю ее значение высоты , затем перехожу к следующей и так далее. Это повторяется тысячи раз и в конечном итоге приводит к такой карте высоты (100 х 100):
Затем я «дискретизирую» карту, уменьшаю количество значений до заданных уровней высоты и назначаю ландшафт / цвет на основе этой высоты:
Больше похожих на архипелаг местностей:
Увеличено количество случайных шагов и уровней высоты, чтобы получить более гористую местность:
Код
Особенности: Воссоздать ландшафт с помощью кнопки. Показать 3D рельеф и 2D карту. Масштабирование (колесо мыши) и 3D-прокрутка (клавиши со стрелками). Но это не очень производительно - в конце концов, это написано исключительно в WPF, а не в DirectX или OpenGL.
MainWindow.xaml:
MainWindow.xaml.cs
источник
JavaScript и Crafty.JS, должны быть значительно улучшены
Вот пример вывода:
А вот код (полная веб-страница):
Вот
sprite.png
:Теперь у меня есть несколько вещей, чтобы сказать.
Не суди меня за этот ужасный код! Пи написал это много лет назад, когда у меня было ужасное программирование. На самом деле, это были старые времена на моем веб-сайте, о которых я даже не помнил! http://oddllama.cu.cc/terrain/
Я вроде как скопировал много кода из демоверсии Crafty.JS Isometric. :П
Объяснение скоро придет! Я должен идти спать, потому что здесь уже поздно. (Вот почему спрайт так ужасен!)
По сути, он действительно не полированный и будет значительно улучшен позже!
Он использует тот же алгоритм алмазного квадрата, упомянутый в ответе ОП.
источник
Ruby + RMagick
Я использую алгоритм Diamond-Square для генерации карты высот.
Кратко алгоритм:
[0,0] == [4,0] == [0,4] == [4,4]
. Также[-2,0] == [2,0]
и т. Д.[0,0]
случайный цвет[0,0] == [4,0] == [0,4] == [4,4]
)Поскольку это приведет к скучному серому изображению, вы должны добавлять случайное число к этому значению на каждом шаге. Предпочтительно, чтобы это случайное значение охватывало весь диапазон на первой итерации, но со временем уменьшается, когда вы обращаетесь к меньшим и меньшим подмножествам массива. Чем меньше эта случайность уменьшается со временем, тем более шумным будет изображение.
После этого я просто назначаю цвет для каждого значения высоты.
Код:
generate.rb
Gemfile
Примечание: изображение, которое я использую, является 16-битным
Результат изображения:
Примечание: это изображение представляет собой изометрическое представление сверху вниз, где размер одного вокселя равен ровно одному пикселю, поэтому он действителен в соответствии с правилами (кроме одного: мой ответ не считается действительным)
источник
Java (используя цветное изображение @ fejesjoco в качестве базового алгоритма)
Немного поиграв с цветными изображениями FullRGB от @fejesjoco, я заметил, что их можно использовать как основу для интересных скалистых воксельных пейзажей. Вместо того, чтобы переопределить алгоритм, я использовал его код в качестве внешнего исполняемого файла (загрузите его с http://joco.name/2014/03/02/all-rgb-colors-in-one-image/ и поместите его как artgen. Отлично в том же каталоге)
Предварительный просмотр:
карта высот используется (хранится в синем канале)
Входное изображение:
Используемый мной подалгоритм работает следующим образом:
1. Сортировка
2. Начните с черного пикселя в центре
3. Пока не будут использованы все цвета: поместите текущий цвет в самое близкое подходящее место и добавьте неиспользуемых соседей в качестве новых пригодных для использования мест Когда он закончится, я искажаю его, чтобы уменьшить до 256 различных значений
red&(green|blue)
4. Затем я использую предварительно сгенерированные спрайты и генерирую изображение слой за слоем.источник
HTML + JavaScript
Вот моя попытка на конкурсе:
Я использую алгоритм Euclidean F1 Cell Noise , чтобы сгенерировать карту высот, которую я затем преобразовываю в изображение, беря соответствующий цвет из массива и рисуя квадрат с высотой 10x, 10y, чтобы высшие пиксели поднимались вверх. Затем я рисую прямоугольник в качестве стороны, используя тот же цвет из другого массива.
Вот тот же код, использующий алгоритм случайного блуждания с 10 000 шагов:
! [Random Walk 2] [4]
Когда он «уходит» с одного края, он наматывается на другой, поэтому все еще выглядит хорошо выложенным плиткой.
Это все еще технически параллельно, просто под другим углом.
источник