python怎么连续画圆_第5章 简易毛笔字(《Python趣味创意编程》教学视频)

3616d8d1566db235c740204349917452.png

(图书介绍:童晶:《Python趣味创意编程》新书预告)

本章我们将实现简易毛笔字程序,读者可以按下鼠标按键移动,在程序窗口写出毛笔字的效果,如图所示。

首先学习鼠标的交互方法,实现鼠标画圆、鼠标画线;接着改变画线的粗细,实现粗细的平滑过渡;最后在一条线段上进行粗细插值,并添加分叉线的绘制。

知乎视频​www.zhihu.com

视频教程:

知乎视频​www.zhihu.com

最终代码:

def setup():  # 初始化函数,仅运行一次
  global maxThickness,offset # 全局变量
  size(1920, 1080)  # 设定画面宽度、高度
  strokeWeight(10) # 设置线条粗细
  background(255)  # 设置白色背景
  maxThickness = 25 # 最粗笔触
  offset = 2 # 用于画偏移分叉线

def draw():  # 绘制函数,每帧重复运行  
  return # 函数直接返回

def mousePressed(): # 当鼠标按键时
  global lastX,lastY,vx,vy,lastThickness # 全局变量
  lastX = mouseX   # 当鼠标按下时,表示这一笔的起点坐标
  lastY = mouseY   
  vx = 0 # 移动的速度初始化为0
  vy = 0
  lastThickness = 1 # 鼠标刚按下时,笔触粗细为1

def mouseDragged(): # 当鼠标按键后拖动时
  global lastX,lastY, vx, vy,lastThickness # 全局变量
  vx = 0.7*vx + 0.3*(mouseX-lastX) # 获得当前移动速度,保持连续插值
  vy = 0.7*vy + 0.3*(mouseY-lastY)
  v = sqrt(vx*vx+vy*vy) # 当前移动速度的模
    
  # 速度越快,笔触越细
  nextThickness = maxThickness - v
  if nextThickness < 0:   # 防止粗细小于0
    nextThickness = 0 
  # 笔触的粗细也需要连续,防止变化太剧烈
  nextThickness = 0.5*nextThickness + 0.5*lastThickness  
  
  n = 10 + int(v/2) # 速度越快,分段数越高 
  for i in range(1,n+1): # 将鼠标前后两个点间分成n段绘制
    x1 = map(i-1,0,n,lastX,mouseX) # 对应的前后两个顶点坐标
    y1 = map(i-1,0,n,lastY,mouseY)
    x2 = map(i,0,n,lastX,mouseX)
    y2 = map(i,0,n,lastY,mouseY)
    # 对应的这一小段的粗细
    thickness = map(i-1,0,n,lastThickness,nextThickness) 
    strokeWeight(thickness+offset) # 主线粗细加一个偏移量
    line(x1,y1,x2,y2)  # 画主线
    strokeWeight(thickness) # 以下画出偏移,模拟毛笔分叉绘制的效果
    line(x1+offset*2,y1+offset*2,x2+offset*2,y2+offset*2) 
    line(x1-offset,y1-offset,x2-offset,y2-offset)  
  
  lastX = mouseX # 更新前一个点的坐标
  lastY = mouseY
  lastThickness = nextThickness # 更新前一个笔触的粗细
  
def keyPressed(): # 当按下任意键盘按键时
  background(255) # 重新用白色填充屏幕

这一章主要讲解了类型转换的语法知识,学习了直线的绘制、鼠标键盘的互动。利用这些知识点,实现了简易毛笔字程序。读者也可以借鉴本章的思路,尝试实现水彩笔、蜡笔、粉笔等其他画笔的绘制效果。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值