生成星空的算法

时间:2013-05-06 15:56:54

标签: javascript algorithm canvas graphics logo-lang

昨天我刚刚了解了Logo。出生于九十年代,我以前从未见过它。所以我开始使用Joshua Bell写的在线Logo Interpreter,我决定写一个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 个答案:

答案 0 :(得分:6)

执行星空的常规方法是在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 

如果你想获得幻想,你也可以用随机亮度绘制星星。还要记住,星星会略微闪烁,所以如果你正在制作动画,那么每帧改变亮度可以使它们看起来更逼真。

答案 1 :(得分:5)

作为矮人要塞的狂热玩家,我会选择分形公式来生成星星。在我看来,计算机随机是不够好的。再次借用DF游戏,我会添加各种步骤来增强星空,例如随机化形状,颜色,大小,发光,聚类(故意在一起添加一堆星星)。

如果你想现实主义,也模拟气体背景。在坚实的黑色背景上,空间不是白点。

最后,我建议你得到一些空间图像(来自我们的老朋友哈勃望远镜)并尝试尽可能忠实地复制它。然后玩参数来达到你的喜好(也许你想用这个来制作游戏)。

P.S:我没有指定任何编码语言,因为我认为它不是关于代码的问题(它非常基本),而是设计问题。你在中在Flash / Actionscript中比在Java上做得更容易,相信我。