当前位置: 首页 > 科技观察

用Python创造炫酷的几何图形

时间:2023-03-18 14:00:05 科技观察

本文转载自微信公众号“Python中文社区”,作者wedo实验者。转载本文请联系Python中文社区公众号。一、什么是turtleTurtle又称turtledrawing,是WallyFeurzeig、SeymourPapert和CynthiaSolomon于1967年创建的Logo编程语言的python实现。Turtle是基于tkinter图形界面设计的。Turtle模拟人在画布前作画的过程:给你一支笔(Pen),落笔(pendown),移动画笔画出你的图形,然后填充颜色等等。Turtle提供了几个简单的命令。通过组合它们的顺序,只要你有足够的耐心,乌龟就能画出令人惊叹的作品,非常适合引导孩子学习编程。先来感受下作品吧:2.Turtleexample下面通过一个简单的例子来了解一下turtle的基本操作Pen()pen.hideturtle()pen.color('red','yellow')#开始绘制第一部分并填充颜色pen.begin_fill()whileTrue:pen.forward(200)pen.left(170)ifabs(pen.pos())<1:breakpen.end_fill()#拿起笔,移动位置,绘制第二部分pen.penup()pen.goto(-100,-100)pen.pendown()foriinrange(5):pen.forward(30)#Length300pixelspen.right(144)#Cornerangle144degreesturtle.done()从上面我们可以看出turtle有两部分组成,分别是笔刷Turtle和canvasScreen,Turtle在Screen上移动进行绘制。需要注意的是,海龟的起始位置是(0,0),位于画布的中心,左边和底部的坐标都是负值。Turtle画笔的重要操作:画笔声明:如果画笔上有很多画笔,需要声明turtle.Pen(),否则默认是画笔,不需要声明,比如turtle.forward(50)表示即画笔向前移动50Brushcolor:color('red','yellow'),第一个红色代表画笔的颜色,黄色代表填充颜色的范围:begin_fill之间画笔的部分移动()和end_fill():forward是向前的距离,left是方向,左边的角度对应backward和right。goto()是画笔移动到某个坐标值的当前属性:比如位置pos()是海龟当前坐标(x,y),方位角值:heading()控制的brush:penup和pendown,默认brush是pendown状态,只要有移动,图形就会绘制到canvas上。如果需要调整位置,在另一个位置写笔,需要先提笔,否则移动画笔时会有线条。这和现实生活中的绘画是一样的。画笔的可见性:一般情况下,画笔呈箭头状,可以通过hideturtle()和showturtle()隐藏和显示画笔屏幕重要操作:设置背景色:bgcolor("white")3.除上述例子之外的其他turtle函数涉及到turtle常用的函数,还有一些比较重要的函数。Circlecircle()前面的例子给出了直线的例子(直线可以组成三角形、多边形等),另一个重要的图形是圆turtle.circle(radius,extent=None,steps=None)让我们参见太极示例:importturtlefromturtleimport*#从turtle中导出所有模块radius=100#Radius为100color("black","black")#画线颜色黑色,填充颜色黑色begin_fill()#开始填充圆(radius/2,180)#逆时针画圆,半径50,180°circle(radius,180)#逆时针画圆,半径100,180°left(180)#转180°圆(-radius/2,180)#画圆clockwisewithradiusof50,180°end_fill()#Fillend#移动到太极图中画的小黑圈的位置,开始画小白圈left(90)#向左转90°,龟头部纵横线向上penup()#拿起笔,向前不留痕迹(半径*0.35)#向前,半径0.35=35像素向右(90)#转right到90°,龟头与右边pendown()的水平线方向一致()#放下笔,开始画线#开始画太极图黑色部分小白圈颜色("white","white")#线条颜色为白色,填充颜色为白色begin_fill()#开始填充圆(半径*0.15)#逆时针画圆,半径为0.15=15个像素(35+15+15+35=100)end_fill()#填充结束left(90)#左转90°penup()#提笔不留痕迹向后(半径*0.7)#向后往下走,即0.7ofradius=70,此时龟头朝上水平垂直pendown()#放下笔开始留下痕迹left(90)#向左转90°,此时龟头在水平方向与左侧相同#开始绘制太极图白色部分黑色小圆圈color("black","black")#线条颜色为黑色,填充为黑色begin_fill()#开始填充循环le(半径*0.15)#开始逆时针画圆,半径为0.15=15像素end_fill()#填充完成右(90)#向右转90°,此时龟头垂直水平向上penup()#Pick上笔不留痕迹backward(radius*0.65)#回到0.65=65像素的半径,下到太极图黑色半圆的底点。right(90)#向右转90°,龟头与右侧水平线方向一致pendown()#给笔,开始留下痕迹circle(radius,180)#逆时针画一个圆,半径为100,180°,绘制太极图白色部分的大圆hideturtle()#藏笔hideturtleturtle.done()radius:半径,radius为正值为逆时针绘制圆弧,否则为顺时针extent:表示是否画圆的一部分,比如半圆是180,默认是整圆steps:表示用多少个多边形来画一个圆,实际上是无限多个多边形来逼近。但是,一般情况下,具有一定程度的多边形,肉眼会人为地使圆变得光滑。可见太极图由2个小半圆、2个大半圆、2个小实圆组成。AnimationControlTurtle绘制图像的过程其实是动态的。每画出一部分图片可以理解为一个视频帧,画完视频就结束了。所以除了绘制图形,turtle还可以用于动画演示或者互动游戏。下面举个例子来说明:importturtle,time#初始画面不更新turtle.tracer(0)#Floorwallwall=turtle.Pen()wall.pencolor('red')wall.pensize(10)wall.hideturtle()wall.penup()wall.goto(-300,-200)wall.pendown()wall.forward(600)#ballR=15ball=turtle.Turtle('circle')ball.shapesize(R/10)ball.penup()pos_x,pos_y=[100,100]pos_x,pos_y=ball.pos()ball.goto(pos_x,pos_y)wall_x,wall_y=wall.pos()#球参数FPS=60#每秒60帧G=0.03#模拟重力加速度DRAG=0.9956#阻力v_y=1#初速度whileTrue:#Clearstampsball.clearstamps()v_y+=G#模拟重力加速度ifpos_y-R-10