Vincent Chan 的巴士站 🚉

用 Python 生成饼状旋转动画

在写一个小游戏过程中,打算做一个饼状旋转的动画,于是打算用 Python 来生成这个动画,假设我们有这样一张图片

red circle

最后生成的动画是这个样子的

当然,中间会生成很多帧的动画

red circle2

怎么去生成每一帧动画呢?其实关键就在于挖去一个饼状图形里面的像素

red ani3

那我们只要遍历这张图片的所有元素,然后挖去在这个饼状范围内的像素即可,从这个思路出发,我们可以很容易想到使用极坐标。假设我们有两条极坐标空间里面的直线 p = Theta1p = Theta2 那我们只要把这两条直线中间的像素挖掉即可。当我们遍历所有元素的时候,我们需要判断这个像素点在极坐标空间中的位置。当然,我们坐标的圆心是整个图片的中心,所以对于每个像素点,我们要减去整张图片中点坐标,求出的相对坐标再作 atan2 计算。

用 math.atan2 求出 theta 之后若在 theta1 和 theta2 之内,则删去即可,所以说核心代码其实很简单:

for x in range(SIZE[0]):
        for y in range(SIZE[1]):
            relative_point = (x - CENTER_POINT[0], y - CENTER_POINT[1])
            theta = math.atan2(relative_point[1], relative_point[0])
            theta = theta * 180 / math.pi + 180

            if theta >= theta1 and theta < theta2:
                draw = ImageDraw.Draw(img, 'RGBA')
                draw.point([x, y], (0, 0, 0, 0))    # write null pixel

最后附上源码 gist 地址: https://gist.github.com/vincentdchan/e120f3cacf88efbba3e51fa1b0084086