本文最后更新于621 天前,其中的信息可能已经过时,如有错误请发送邮件到2038899329@qq.com
以下代码需要在https://coding.qq.com/p5-lab/ 运行
1、转动眼珠的圆脸
def setup():
size(800,600)
def draw():
background(255)
fill(255)
circle(400,300,500)
circle(305,180,180)
circle(495,180,180)
circle(400,300,40)
circle(400,420,140)
fill(0)
x1 = map(mouseX,0,width,280,330)
y1 = map(mouseY,0,height,155,195)
circle(x1,y1,110)
x2 = map(mouseX,0,width,470,520)
y2 = map(mouseY,0,height,155,195)
circle(x2,y2,110)
2、跟随鼠标移动的园圈
def setup():
size(600,600)
def draw():
circle(mouseX,mouseY,100)
3、互相作用的圆球
balls = [] # 存储所有圆球的全局变量,初始为空列表
def setup():
size(800, 800) # 设定画布大小
noStroke() # 不绘制线条
def draw():
background(30) # 黑灰色背景
for i in range(len(balls)):
fx = 0 # 第i号圆球,x方向所受合力
fy = 0 # 第i号圆球,y方向所受合力
for j in range(len(balls)): # 对其他所有球遍历
if (i!=j): # 对于不等于i的j
dx = balls[j][0] - balls[i][0] # 两个小球x坐标差
dy = balls[j][1] - balls[i][1] # 两个小球y坐标差
distance = sqrt(dx*dx + dy*dy) # 两个小球间的距离
if distance < 1: # 防止距离过小,有除0的风险
distance = 1
# j号球对i号球的作用力大小
f_mag = (distance - 300)* balls[j][4]
fx += f_mag*dx/distance # 求出x方向的受力,加到fx上
fy += f_mag*dy/distance # 求出y方向的受力,加到fy上
ax = fx/balls[i][4] *0.05 # 合力除以质量,计算两个方向的加速度
ay = fy/balls[i][4] *0.05
balls[i][2] = 0.99*balls[i][2] + 0.01*ax # 根据加速度更新速度
balls[i][3] = 0.99*balls[i][3] + 0.01*ay
for ball in balls: # 对所有圆球遍历
ball[0] += ball[2] # 根据x方向速度,更新x坐标
ball[1] += ball[3] # 根据y方向速度,更新y坐标
fill(ball[5],230) # 设置填充颜色
circle(ball[0], ball[1], 2*ball[4]) # 画一个圆
def addBall(): # 添加一个新的圆球
radius = random(5,20) # 随机半径
# 随机颜色
c = color(random(100,255),random(100,255),random(100,255))
# ball = [x坐标,y坐标,x方向速度,y方向速度,半径,颜色]
ball = [mouseX,mouseY,0,0,radius,c] # 当前圆球列表
balls.append(ball) # 把圆球添加到balls中
def mousePressed(): # 鼠标点击时
addBall() # 添加一个新的圆球
def mouseDragged(): # 鼠标拖拽时
if frameCount % 5 == 0: # 防止添加过多圆球
addBall() # 添加一个新的圆球
def keyPressed(): # 当按下任意键盘按键时
global balls # 全局变量
if len(balls)>0: # 如果blls列表不为空
balls = [] # 清空所有圆球
4,随风飘动的粒子
particles = [] # 存储所有粒子的全局变量,初始为空列表
def setup():
size(1280, 800) # 设定画布大小
noStroke() # 不绘制线条
for i in range(2000): # 生成2000个粒子
x = random(0,width) # 设置圆心x坐标
y = random(0,height) # 设置圆心y坐标
v_mag = random(1.0,2.0) # 速度绝对值大小
v_angle = random(-2*PI,2*PI) # 速度的方向
c = color(random(100,255),random(100,255),random(100,255))
particle = [x,y,v_mag,v_angle,c] # 当前粒子
particles.append(particle) # 把粒子添加到particles中
def draw():
fill(0, 10) # 设置填充色为黑色,透明度为10
rect(0, 0, width, height) # 绘制一个半透明的大矩形
fill(255) # 设置填充色为白色,用于下面绘制粒子
for particle in particles:
noiseValue = noise(0.001*particle[0],10+0.001*particle[1] \
,frameCount*0.005)
particle[3] = map(noiseValue,0,1,-2*PI,PI*2) #速度方向随机扰动
vx = particle[2]*cos(particle[3]) # x方向速度
vy = particle[2]*sin(particle[3]) # y方向速度
particle[0] = particle[0] + vx # x坐标变化
particle[1] = particle[1] + vy # y坐标变化
# 粒子碰到边界后随机出现
if particle[0]<0 or particle[0]>width \
or particle[1]<0 or particle[1]>height:
particle[0] = random(0,width) # 设置圆心x坐标
particle[1] = random(0,height) # 设置圆心y坐标
r = map(sin(frameCount/75.0),-1,1,50,255) # 随机红色分量
g = map(sin(frameCount/101.0),-1,1,75,255) # 随机绿色分量
b = map(sin(frameCount/151.0),-1,1,100,255) # 随机蓝色分量
particle[4] = color(r,g,b) # 设置随机颜色
fill(particle[4]) # 设置填充颜色
circle(particle[0], particle[1], 2) # 画一个直径为2的圆点
5、旋转的圆弧
def setup(): # 初始化函数,仅运行一次
global spanAngle,spanAngleSpeed # 全局变量
size(600, 600) # 设定画面宽度、高度
noFill() # 不填充
strokeWeight(3) # 设置线条粗细
spanAngle = 0 # 圆弧跨越的角度,初始为0
spanAngleSpeed = 0.5 # 圆弧跨越角度变化速度
def draw(): # 绘制函数,每帧重复运行
global spanAngle,spanAngleSpeed # 全局变量
background(255) # 设置白色背景,并覆盖整个画面
# 圆弧终点角度,随着帧率循环变大
endAngle = 2*radians(frameCount % 360)
spanAngle = spanAngle + radians(spanAngleSpeed) # 圆弧跨越角度变化
startAngle = endAngle - spanAngle # 求出圆弧起点角度
if spanAngle > 2*PI or spanAngle < 0: # 当跨越角度达到2PI或0时
spanAngleSpeed = -spanAngleSpeed # 更改跨越角度变化速度的方向
for diam in range(50,width,50): # 圆弧直径从50开始遍历到width
angleShift = radians(360*diam/width) # 不同直径圆弧有个偏移量
arc(width/2,height/2,diam,diam, # 绘制对应的各个圆弧
startAngle+angleShift,endAngle+angleShift)