生成星空的算法

4

昨天我刚学习了Logo。作为一个90后,我以前从未接触过它。所以我开始使用由Joshua Bell编写的在线Logo解释器,并决定编写一个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倍,我最终得到了这样一张图片:Logo starfield generated by 160 concentric circles with increasing radii in multiples of 30.
这真是太惊人了。乍一看,它看起来像是真实的夜空照片,这让我想到了一个问题——有没有通用的算法来绘制星场?
顺便说一下,如果你仔细看,可以看到一个30 x 30像素的方格网络。边界是黑色的,所以有点难以注意到。

2
我不会“做”标志,也不知道生成星空的通用算法,但如果我要自己动手,我会选择直接的解决方案,即生成一个随机的x和y,并将其设置为一颗星的位置。我会在循环中执行此操作,直到达到某个哨兵值并退出。我以前做过这样的事情,通常可以得到合理的结果(即看起来像一个“真实”的星空)。 - Frecklefoot
2
这真是令人惊叹。谢谢!你是自己想出来的吗? - likeitlikeit
2
@likeitlikeit - 我只是在一个环形阵列上不停地画同心圆。结果看起来像星空。=) - Aadit M Shah
2个回答

6

通常制作星空的方法是在 x/y 平面上随机选择点,伪代码如下:

fill image with black
for (however many stars you want)
   x = random() * width
   y = random() * height
   plot star at position x,y 
loop 

如果你想要更加复杂的效果,你可以随机设置星星的亮度。另外需要记住,星星会轻微闪烁,所以如果你在制作动画时每帧都稍微变化一下亮度,就会让它们看起来更加逼真。

5
作为一名狂热的《矮人要塞》玩家,我会选择使用分形公式来生成星星。在我看来,计算机随机生成的结果并不够好。再次借鉴《矮人要塞》游戏的经验,我会添加各种步骤来增强星空效果,例如随机形状、颜色、大小、发光度和聚类(有意将一团星星聚集在一起)。
如果你想追求真实感,还应该模拟气体背景。太空不是黑色背景上的白点。
最后,我建议你获取一些太空图像(从我们的老朋友哈勃望远镜中获取),尽可能忠实地复制它们。然后调整参数以达到你的喜好(也许你想把这个做成一个游戏)。
附言:我没有指定任何编程语言,因为我认为这不是一个关于代码的问题(它非常基础),而是一个关于设计的问题。相信我,在Flash / Actionscript中要比Java容易得多。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接