这是一条数模小蛇,它会祝你在数模比赛中,算法永不打结,思路不会杂乱,论文行云流水,难题迎刃而解!让我们说谢谢小蛇!
以下均采用python绘制,代码部分已经做好了注释,大家可以自行复制运行吼。
我们先来绘制文章开头的最简单的小蛇:
import turtle
turtle.setup(650,350,200,200)#窗体宽高和xy坐标
turtle.penup()#抬起画笔
turtle.fd(-250)#往前,走直线,默认在窗体正中间
turtle.pendown()#画笔降落,继续绘制小蛇
turtle.pensize(30)#笔的粗细,可以按照小蛇的“腰围”自定义哦
turtle.pencolor("green")#小蛇的颜色,今年是木蛇年,可以用绿色来画
turtle.seth(-40)#小蛇的方向,绝对坐标系中(以屏幕正右方为0度,逆时针为正度数)的-40度方向
for i in range(4):
#以左侧距离为r(如果r是负数,则以右侧距离-r)的点为圆心蛇皮走位(半径,旋转角度)
turtle.circle(40,80)
turtle.circle(-40,80)
turtle.circle(40,80/2)
turtle.fd(40)
turtle.circle(16,180)
turtle.fd(40*2/3)
#程序运行之后,不会退出
turtle.done()
接下来我们可以进阶一下,绘制一条彩色的小蛇:
import turtle
turtle.setup(650, 350, 200, 200)#设置turtle窗口的大小为650x350像素,初始位置在屏幕的(200, 200)位置。
turtle.penup()#抬起画笔,移动时不绘制线条。
turtle.fd(-250)#向前移动250像素,由于之前已经抬起画笔,所以这一步不会绘制任何线条。
turtle.pendown()#放下画笔,准备开始绘制。
turtle.pensize(30)#设置小蛇的粗细为30像素。
colors = ["red", "blue", "green", "yellow", "purple"]#定义一个颜色列表,用于绘制图案。
turtle.pencolor(colors[0])#设置画笔颜色为颜色列表中的第一个颜色,即红色。
turtle.seth(-40)#设置画笔的朝向为-40度。
turtle.shape("circle") # 将turtle的形状更改为圆形。
turtle.shapesize(0.5)#调整turtle形状的大小为原始大小的0.5倍。
for i in range(4):#开始一个循环,循环4次。
turtle.circle(40, 80)#绘制一个半径为40像素,角度为80度的圆弧。
turtle.pencolor(colors[i % len(colors)])#在每次循环中改变画笔颜色为颜色列表中的下一个颜色。
turtle.circle(-40, 80)#绘制一个半径为40像素,角度为80度的圆弧,方向与上一个圆弧相反。
turtle.pencolor(colors[(i + 1) % len(colors)]) # Change color after each loop
turtle.circle(40, 80 / 2)#绘制一个半径为40像素,角度为40度的圆弧。
turtle.fd(40)#向前移动40像素。
turtle.pencolor(colors[-1]) # 将画笔颜色设置为颜色列表中的最后一个颜色,即紫色。
turtle.circle(16, 180)#绘制一个半径为16像素,角度为180度的圆弧。
turtle.fd(40 * 2 / 3)#向前移动(40 * 2 / 3)像素,即大约26.67像素。
turtle.done()#完成绘制,保持窗口打开直到用户关闭它。
好,看来大家都学会啦,那我们就继续上个难度,来绘制一幅简笔画可爱小蛇
import turtle as t # 导入turtle模块,并给它起一个别名t
t.title('蛇') # 设置绘图窗口的标题为“蛇”
t.pencolor("green") # 设置画笔的颜色为绿色,这将是蛇的主体颜色
t.pensize(10) # 设置画笔的粗细为10像素
t.penup() # 抬起画笔,移动到指定位置时不会绘制线条
t.goto(-200, 150) # 将画笔移动到坐标(-200, 150)的位置
t.pendown() # 放下画笔,准备开始绘制
# 绘制蛇的头部和身体部分
t.circle(-30, -180) # 绘制一个半径为30像素,角度为180度的圆弧,注意负角度表示逆时针方向
t.setheading(165) # 设置画笔的朝向为165度
t.circle(-60, -50) # 绘制一个半径为60像素,角度为50度的圆弧
t.penup() # 抬起画笔,准备移动到下一个绘制起点
t.goto(-180, 90) # 将画笔移动到坐标(-180, 90)的位置
t.pendown() # 放下画笔,继续绘制
t.setheading(120) # 设置画笔的朝向为120度
t.circle(100, -50) # 绘制一个半径为100像素,角度为50度的圆弧
t.circle(-60, -50) # 绘制一个半径为60像素,角度为50度的圆弧
t.circle(-80, -50) # 绘制一个半径为80像素,角度为50度的圆弧
t.circle(-60, -50) # 再次绘制一个半径为60像素,角度为50度的圆弧
t.circle(130, -30) # 绘制一个半径为130像素,角度为30度的圆弧
t.circle(70, -30) # 绘制一个半径为70像素,角度为30度的圆弧
t.circle(30, -100) # 绘制一个半径为30像素,角度为100度的圆弧
t.circle(-30, -120) # 绘制一个半径为30像素,角度为120度的圆弧
t.setheading(-50) # 设置画笔的朝向为-50度
t.circle(30, -120) # 绘制一个半径为30像素,角度为120度的圆弧
t.setheading(-120) # 设置画笔的朝向为-120度
t.circle(-50, -100) # 绘制一个半径为50像素,角度为100度的圆弧
t.setheading(-30) # 设置画笔的朝向为-30度
t.circle(-105, -70) # 绘制一个半径为105像素,角度为70度的圆弧
t.circle(50, -140) # 绘制一个半径为50像素,角度为140度的圆弧
t.penup() # 抬起画笔,准备移动到下一个绘制起点
t.goto(-200, 150) # 将画笔移动到坐标(-200, 150)的位置
t.pendown() # 放下画笔,继续绘制
t.setheading(195) # 设置画笔的朝向为195度
t.circle(70, -132) # 绘制一个半径为70像素,角度为132度的圆弧
t.circle(90, -20) # 绘制一个半径为90像素,角度为20度的圆弧
# 绘制蛇的舌头
t.pencolor("red") # 设置画笔的颜色为红色,用于绘制蛇的舌头
t.pensize(3) # 设置画笔的粗细为3像素
t.penup() # 抬起画笔,准备移动到舌头的绘制起点
t.goto(-230, 100) # 将画笔移动到坐标(-230, 100)的位置
t.pendown() # 放下画笔,开始绘制舌头
t.circle(30, -60) # 绘制一个半径为30像素,角度为60度的圆弧,形成舌头的形状
# 绘制蛇的眼睛
t.pencolor("black") # 设置画笔的颜色为黑色,用于绘制蛇的眼睛
t.pensize(3) # 保持画笔的粗细为3像素
t.shape('circle') # 设置turtle的形状为圆形,这样绘制时会显示为一个圆点
t.penup() # 抬起画笔,准备移动到眼睛的绘制起点
t.goto(-190, 120) # 将画笔移动到坐标(-190, 120)的位置
t.pendown() # 放下画笔,开始绘制眼睛
t.done() # 完成绘制,保持窗口打开直到用户关闭它
除了绘制特定的图案,也可以根据上传的图片绘制任何你想要的小萌蛇
这个代码与上文略有不同,先利用opencv进行边缘检测,将检测出来的边缘信息作为turtle的输入进行绘制。因此,你可以将其替换成任何你想画的图,但是需要注意路径中不要有中文字符哦~
import cv2 # 导入OpenCV库,用于图像处理
import turtle # 导入turtle库,用于绘图
# 加载图像并进行边缘检测
image_path = 'F:/data_process/img/4.jpg' # 图像文件的路径
# 尝试读取图像
image = cv2.imread(image_path) # 使用OpenCV的imread函数读取图像
# 将图像转换为灰度图,因为边缘检测通常在灰度图上进行
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 使用Canny算法进行边缘检测
edges = cv2.Canny(gray, 50, 150) # Canny边缘检测,50和150是阈值参数
# 创建Turtle画布
screen = turtle.Screen() # 创建一个Screen对象
screen.setup(image.shape[1], image.shape[0]) # 设置画布大小为图像的宽度和高度
screen.setworldcoordinates(0, 0, image.shape[1], image.shape[0]) # 设置画布的坐标系统与图像坐标对应
# 注释掉的代码,用于关闭turtle的自动更新,可以查看画图过程,但在此代码中未启用
turtle.tracer(False)
# 创建Turtle画笔
pen = turtle.Turtle() # 创建一个Turtle对象
pen.speed(10) # 设置画笔的速度,10是最快
pen.hideturtle() # 隐藏画笔的turtle形状
# 绘制边缘
for y in range(edges.shape[0]): # 遍历图像的每一行
for x in range(edges.shape[1]): # 遍历图像的每一列
if edges[y, x] > 0: # 如果在边缘检测结果中,该像素是边缘的一部分
pen.penup() # 抬起画笔,移动到新位置时不绘制
pen.goto(x, edges.shape[0] - y) # 移动到新位置,注意y坐标需要翻转以匹配图像坐标
pen.pendown() # 放下画笔,开始绘制
pen.forward(1) # 向前绘制一个像素
# 关闭窗口
turtle.done() # 完成绘制,保持窗口打开直到用户关闭它
新的一年,元旦福利当然少不了!
为帮助同学们提升美赛中编程能力!
特推出Python能力提升课
扫描下方二维码即可报名
同时我们致力于为国内学生报名国际赛事
为同学们省去大部分繁琐流程的同时
还附赠赛题讲解
现针对美赛特推出美赛辅助报名!
↓↓
赛氪连续13年为美赛辅助报名提供服务,截至目前已成功为23万余名学生完成了美赛辅助报名!成为目前全球最大、最靠谱、参赛院校最广的辅助报名平台。赛氪美赛辅助报名不仅仅只是单纯的报名服务,后续赛前指导、赛中操作流程及注意事项指引等竞赛故障问题,全程免费为参赛者服务。
1.辅助报名截止时间:北京时间2025年1月23日23:00
2.比赛时间:北京时间2025年1月24日早晨6:00点(星期五) 至 2025年1月28日上午9:00(星期二)
3.提交截止日期:北京时间2025年1月28日上午10:00(星期二)
4.比赛结果:结果将于2025年5月31日或之前发布。
扫描下方二维码报名
https://www.saikr.com/vse/comap/2025?ces=gzh
注:
1、可以提供开发票服务及服务说明用于报销,有需要的同学可填写发票申请链接,申请后将在1-2周后发到申请邮箱中。
2、美赛官网报名成功凭证电子receipt可免费下载。
3、只报名不要证书的同学走下面集体报名的方式:填表、缴费、截图 发邮箱,等回复邮件后登录美赛官网核对信息。
4、凡通过赛氪进行辅助报名的队伍,在比赛报名截止前2天如有其他问题无法参赛,可协助队伍办理退赛!
凡是报名参加“美赛辅助报名以及证书打印邮寄活动”的同学,均可享受以下服务:
1. 数学建模资料大礼包(最新的论文模板Word、Latex模板,保姆式的提交参赛作品说明文档,历年美赛特等奖论文集,历年竞赛赛题及中文翻译,数模电子书、常用数据库等资料,Matlab、SPSS、Latex等软件包,包含了参赛必备的所有资料,节省大量备赛时间);
2. 免费获得价值500元的美赛专属课程一门,3人同享(共30学时,包含:数学建模入门、数学实验、初等数学模型、优化数学模型、排队论模型、数学处理模型、智能优化算法、赛题解析、学术论文的写作与投稿九大方面的内容)。(报名成功后点击下方图片链接,直接进入学习)
3.OF奖可以免费指导发表EI会议论文(会议费版面费需自付,可升级优惠指导发表SCI论文);其他奖项可优惠指导发表EI会议论文
4. 免费获得2020-2023年美国大学生数学建模竞赛真题的视频讲解。(报名成功后也在上方基础课程中进行学习,自动开通课程)
5. 2025年美赛,特邀请美赛数模教学名师、历年O奖得主进行“2025美赛备考经验分享”系列公开直播课。
辅助报名负责人QQ:1870544744
负责人微信号:13110023072(张老师)
美赛辅助报名接待群:996319224
点击“阅读原文”,进入辅助报名官网
更多
↓↓
数学建模资料、视频讲解、历年赛题
后台回复 【校苑】领取