使用PyGame库绘制贝塞尔曲线(Bezier Curve)时终点不符合预期
问题原因
- 漏导入
pygame依赖,原代码没有写import pygame语句,直接调用pygame.init()会触发报错 - 二阶贝塞尔曲线计算公式错误,控制点
p1的系数项遗漏了参数t,正确的二阶贝塞尔公式为:B(t) = (1-t)²p0 + 2t(1-t)p1 + t²p2, t∈[0,1] - 参数
t的迭代逻辑和循环次数不匹配,你用np.arange(0,1,0.001)会执行1000次循环,每次t加0.01的话,循环结束时t会达到10,远超出贝塞尔参数的合法取值范围[0,1],自然无法落在终点p2的位置 - 没有添加清屏逻辑,多次渲染的曲线会重叠在画布上
修正后可运行代码
import pygame from pygame.locals import * from sys import exit import numpy as np pygame.init() x = 1200 y = 600 screen = pygame.display.set_mode((x,y)) while True: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() exit() # 每次刷新清屏 screen.fill((0,0,0)) p0 = 30,30 p1 = 60,15 p2 = 30,90 t = 0 # 步长和t增量保持一致 for i in np.arange(0,1,0.001): px = p0[0]*(1-t)**2 + 2*(1-t)*t*p1[0] + p2[0]*t**2 py = p0[1]*(1-t)**2 + 2*(1-t)*t*p1[1] + p2[1]*t**2 t = t + 0.001 pygame.draw.rect(screen,(255,0,0), (px,py,1,1)) pygame.display.update()
内容的提问来源于stack exchange,提问作者skai
相关产品推荐
相关产品推荐

