Алгоритм генерации звездного поля
Я только что узнал о логотипе вчера. Родившись в девяностых, я никогда не сталкивался с этим раньше. Поэтому я начал использовать интерактивный переводчик логотипов, написанный Джошуа Беллом, и решил написать circle
функция, чтобы сделать концентрические круги. Вот что я написал:
cs
to circle
penup forward :radius right 90
pendown repeat 360 [forward 3.14 * :radius / 180 right 1]
penup left 90 back :radius pendown
end
make "radius 30
repeat 160 [circle make "radius :radius + 30]
Интересно, что холст для рисования представляет собой тороидальный массив. Следовательно, круги в конечном итоге перекрываются. Нарисовав 160 концентрических кругов с увеличивающимися радиусами, кратными 30, я получил изображение, подобное этому:
Это действительно удивительно. На первый взгляд это похоже на подлинную картину ночного неба, и это заставило меня задуматься - есть ли общий алгоритм рисования звездного поля?
Кстати, если вы посмотрите внимательно, вы можете увидеть сетку 30 x 30
квадраты пикселей. Границы черные, так что это немного трудно заметить.
2 ответа
Будучи заядлым игроком в Dwarf Fortress, я бы выбрал фрактальную формулу для генерации звезд. Компьютерная случайность просто не достаточно хороша, на мой взгляд. Заимствуя из DF-игры снова, я бы добавил различные шаги для улучшения звездного поля, такие как рандомизация формы, цвета, размера, свечения, скопления (намеренное добавление скопления звезд вместе).
Если вы хотите идти с реализмом, также имитируйте фон газа. Космос не белые точки на сплошном черном фоне.
Наконец, я бы посоветовал вам получить космические снимки (с телескопа нашего старого друга Хаббла) и попытаться скопировать их как можно точнее. Затем поиграйте с параметрами, которые вам понравятся (возможно, вы захотите сделать из этого игру).
PS: я не указал какой-либо язык кодирования, потому что считаю, что это не вопрос кода (он довольно простой), а вопрос дизайна. Вы бы сделали это намного проще во Flash / Actionscript, чем на Java, поверьте мне.
Обычный способ создания звездного поля состоит в том, чтобы случайным образом выбирать точки в плоскости x/y, в psuedocode что-то вроде:
fill image with black
for (however many stars you want)
x = random() * width
y = random() * height
plot star at position x,y
loop
Если вы хотите получить фантазию, вы также можете наносить звезды со случайной яркостью. Также помните, что звезды слегка мерцают, поэтому, если вы делаете анимацию, то немного меняя яркость, каждый кадр может сделать их более реалистичными.