Python 生成随机星云图

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


制作背景

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

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

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

效果图片

随机移动了5千万步.png

源代码

"""
像素点随机移动
一个点在一个明面上任意上下左右四个方向移动,留下一个淡淡的颜色,最终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
        print("↑", end="")
        color()
    elif xy == 2:
        x += 1
        print("→", end="")
        color()
    elif xy == 3:
        y += 1
        print("↓", end="")
        color()
    elif xy == 4:
        x -= 1
        print("←", end="")
        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个方向或者四个方向。
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。