pygame实现旋转的摩天轮
董世浩编辑:
说明:在pycharm平台实现的图像旋转
一、案例描述
通过确定圆心,在一个以坐标原点为圆心的假想圆的圆周上绘制一定数量的点,并在这些点和圆心之间做直线,同时为每条直线圆心处的点和圆周上的点设定一种颜色,使得颜色渐变,最终让其旋转起来。
知识点:
窗口的绘制,等分点的寻找
二、实现步骤
1、首先使用pygame创建一个窗口,以便显示图像
2、通过循环找出半径为300,圆心位置在(500,500)上的30个等分点
3、构建draw()函数,进行圆心位置与等分点的连线
4、设置时钟信号与清屏功能,产生旋转效果
三、实现算法
首先,使用DDA算法画直线
DDA算法
'''
if k > -1 and k < 1:
# X 最大位移
while True:
if x > x1:
break
add_pixel(x, y, bx, 1)
x = x+1
y = y+k
elif k >= 1:
# Y 最大位移
while True:
if y > y1:
break
add_pixel(x, y, bx, 1)
y = y+1
x = x+1/k
else:
while True:
if y < y1:
break
add_pixel(x, y, bx, 1)
y = y-1
x = x-1/k
再实现Bresenham算法构建直线
if k > 1:
while True:
if y > y1:
break
add_pixel(x, y, ax, 0)
y = y + 1
d = d + 1 / k
if d > 0.5:
x = x + 1
d = d - 1
elif k > 0:
while True:
if x > x1:
break
add_pixel(x, y, ax, 0)
x = x + 1
d = d + k
if d > 0.5:
y = y + 1
d = d - 1
elif k > -1:
while True:
if x > x1:
break
add_pixel(x, y, ax, 0)
x = x + 1
d = d - k
if d > 0.5:
y = y - 1
d = d - 1
else:
while True:
if y < y1:
break
add_pixel(x, y, ax, 0)
y = y - 1
d = d - 1 / k
if d > 0.5:
x = x + 1
d = d - 1
实现旋转的摩天轮的完整代码:
import pygame, os
import numpy as np
pi = 3.1415
FPS = 100
thare = 0
fpsClock = pygame.time.Clock()
# 初始化pygame
pygame.init()
R = 300 # 半径
number_point = 30 # 等分点数量
temp = np.linspace(0, 2 * np.pi, 1000)
X = np.sin(temp) * R
Y = np.cos(temp) * R
# 设置窗口的大小,单位为像素
screen = pygame.display.set_mode((1000, 1000))
pygame.display.set_caption('xuanzhaun')
# 定义颜色
BLACK = ( 0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = ( 0, 255, 0)
BLUE = ( 0, 0, 255)
# 设置背景颜色
screen.fill(WHITE)
# 绘制一条线
def draw():
for i in range(30):
m = int(x[i] + 500)
n = int(y[i] + 500)
pygame.draw.line(screen, GREEN, [500, 500], [m,n], 3)
pygame.draw.circle(screen, BLUE, [m,n], 10, 0)
#pygame.display.update()
# 设置pygame时钟的间隔时间
fpsClock.tick(FPS)
while(thare<100000):
x = []
y = []
for i in range(number_point):
x.append(R * np.sin(i * 2 * pi / number_point + thare))
y.append(R * np.cos(i * 2 * pi / number_point + thare))
thare = thare+1
pygame.draw.circle(screen, GREEN, [500, 500], 300, 1)
draw()
pygame.display.update()
screen.fill(WHITE)
四、实现效果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4N40Sutf-1603118083564)(file:///C:\Users\dsh\AppData\Roaming\Tencent\Users\2801081173\QQ\WinTemp\RichOle\2O4NR87HYLS}~X`UY7EUD%M.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cuvnDkFG-1603118083567)(C:\Users\dsh\Desktop\发发发.gif)]
五、总结
pygame.display.update()
screen.fill(WHITE)
### 四、实现效果
[外链图片转存中...(img-4N40Sutf-1603118083564)]
[外链图片转存中...(img-cuvnDkFG-1603118083567)]
### 五、总结
在老师发了本次作业后,我最开始看了关于MFC实现的相关程序,仔细阅读完程序后,就决定用Python来实现这么一个动画过程。在实现的过程中,也是遇到了许多的小问题,比如设置好增加角度循环,再重绘显示后,在背景框上并没有动画的显示。在翻阅资料后才知道,必须在绘制过程中加一个时钟延时过程,才可以看见动画效果。