Python 生成随机星云图(2020年3月14日)


制作背景

学习了python,有了一定的基础,并了解了图像处理的第三方库PIL,大一下学期初,新馆疫情初时代再家。

忽然脑海里就想到了一个程序:输出一个图片,图片上有一个移动的小点,这个小点从图片的中心开始随机上下左右走动,每走一步就随机再选一个方向走,如果走到了图片的边缘位置就会重新跳转到图片的中心位置。走过的地方都变成蓝色,那么会输出一张什么样的图片?

于是带着这样一个想法我顺手写了这个程序。

效果图片

24975120-2c9271aa6356516e

源代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
"""
像素点随机移动
一个点在一个明面上任意上下左右四个方向移动,留下一个淡淡的颜色,最终n步后生成一张图
2020年3月14日创建
by littlefean
"""
from PIL import Image
from random import randint
import time
xSize = 500
ySize = 500
x = int(xSize/2)
y = int(xSize/2)
im = Image.new('RGBA', (xSize, ySize), 'black')
im.getpixel((x, y))
step = 5000


def move():
"""随机生成并返回12345678个数字,分别代表 上右下左 右上 右下 左下 左上"""
mode = 1
if mode == 1:
return randint(1, 8)


def color():
"""在所在像素下点涂颜色"""
global im, x, y
add_color = 255
src_str_list = im.load()
data = src_str_list[x, y]
data_list = list(data)
print(data)
if data_list[0] < 255:
data_list[0] += add_color
data_list[1] += add_color
data_list[2] += add_color
data = tuple(data_list)
im.putpixel((x, y), data)


def judge():
"""判断是否已经走到边界上"""
global x, y, xSize, ySize
b = int(xSize/2)
if x >= xSize-1:
x -= b
if y >= ySize-1:
y -= b
if x <= 1:
x += b
if y <= 0:
y += b


def draw():
"""根据move返回值来移动图片上的像素点"""
global x, y, im
xy = move()
if xy == 1:
y -= 1
color()
elif xy == 2:
x += 1
color()
elif xy == 3:
y += 1
color()
elif xy == 4:
x -= 1
color()
elif xy == 5:
x += 1
y -= 1
color()
elif xy == 6:
x += 1
y += 1
color()
elif xy == 7:
x -= 1
y += 1
color()
elif xy == 8:
x -= 1
y -= 1
color()


while True:
t1 = time.time()
for i in range(step):
move()
draw()
judge()
im.save(f'RandomMove2D_{i}.png')
t2 = time.time()
input(f"end by {step} step/ncost {t2 - t1} second")

回首与反思

现在我发布的时候已经是 2020年11月1日 了,好几个月过去了。现在回看以前的代码,说实话我自己感觉很不好看,发出来也就记录一下自己当初憨憨的样子吧。

  1. 首先函数名称起的就并不是很好,在程序里一般不用judge这个词表示判断。
  2. 我当时居然还在用global。。。其实能不用global尽量不用它。全局变量降低了程序的维护性。
  3. 我当时还不会写 if __name__ == '__main__',其实最好再写一个main函数来,优化整个程序的结构。
  4. 其实更好先用numpy来做运算,运算好了之后统一一下字渲染成图片并输出。这样应该会快很多。
  5. draw函数看上去很长,也非常不够优雅,可以用数学表达式进行简化,可以随机一个角度值然后近似转化成8个方向或者四个方向。