如何在fx-CG50计算器上借助casioplot实现2D Bézier曲线?
在fx-CG50计算器上实现2D Bézier曲线(基于casioplot库)
核心原理(适合初中知识水平)
Bézier曲线不需要微积分,核心就是线性插值——简单说就是找两个点之间的中间点。常用的是二次(3个控制点)和三次(4个控制点)曲线,足够覆盖大部分绘图需求:
二次Bézier(3个控制点P0、P1、P2)
- 取参数
t(从0到1,代表从曲线起点到终点的进度) - 先算P0到P1的插值点:
A = P0*(1-t) + P1*t - 再算P1到P2的插值点:
B = P1*(1-t) + P2*t - 最后算A到B的插值点,就是曲线上的点:
C = A*(1-t) + B*t
展开后可以直接用公式计算:C = P0*(1-t)² + P1*2t(1-t) + P2*t²
三次Bézier(4个控制点P0、P1、P2、P3)
多一层插值,最终公式:C = P0*(1-t)³ + P1*3t(1-t)² + P2*3t²(1-t) + P3*t³
代码实现
先导入必备库:
from casioplot import * import math # 按要求保留,插值逻辑无需额外调用
二次Bézier绘制函数
def draw_quadratic_bezier(p0, p1, p2, color=(255,255,255)): # p0/p1/p2是(x,y)元组,代表三个控制点;color是RGB三元组 step = 0.01 # t的步长,越小曲线越平滑,0.01在fx-CG50上速度适中 t = 0.0 while t <= 1.0: # 计算当前t对应的像素坐标 x = p0[0] * (1-t)**2 + p1[0] * 2*t*(1-t) + p2[0] * t**2 y = p0[1] * (1-t)**2 + p1[1] * 2*t*(1-t) + p2[1] * t**2 # 转成整数像素位置,用round避免坐标偏移 setpixel(int(round(x)), int(round(y)), color) t += step
三次Bézier绘制函数
def draw_cubic_bezier(p0, p1, p2, p3, color=(255,255,255)): step = 0.01 t = 0.0 while t <= 1.0: x = p0[0]*(1-t)**3 + p1[0]*3*t*(1-t)**2 + p2[0]*3*t**2*(1-t) + p3[0]*t**3 y = p0[1]*(1-t)**3 + p1[1]*3*t*(1-t)**2 + p2[1]*3*t**2*(1-t) + p3[1]*t**3 setpixel(int(round(x)), int(round(y)), color) t += step
使用示例
# 清屏 clearscreen() # 画一条绿色的二次Bézier曲线,控制点对应屏幕上的位置 draw_quadratic_bezier((50, 200), (150, 50), (250, 200), (0,255,0)) # 画一条红色的三次Bézier曲线 draw_cubic_bezier((30, 30), (100, 180), (280, 30), (350, 180), (255,0,0)) # 必须调用showscreen才会显示所有绘制的点 showscreen()
关键注意事项
setpixel仅更新VRAM,所有点绘制完成后一定要调用showscreen()才能看到效果- fx-CG50屏幕分辨率是384x216,控制点坐标不要超出
x:0-383、y:0-215范围,否则点不会显示 - 步长
step可以调整:0.01兼顾平滑度和速度,若追求更细腻的曲线可以改成0.005,但绘制时间会变长 - 用
round()转换坐标比直接强转int()更准确,能减少曲线锯齿
内容的提问来源于stack exchange,提问作者Vladimir Sharin
相关产品推荐
相关产品推荐

