Pyhon海龟绘制木叶村徽章

2020-09-23 11:27:06 浏览数 (2)

turtle库是python标准库之一,入门级绘图库。import turtle之后即可使用。

以下是关于turtle的语句文档,可能有遗漏,但是够用了

画布

turtle.screensize() //设置画布像素背景颜色

代码语言:javascript复制
turtle.screensize(800,600,'green')#设置画布像素为800*600 画布背景为绿色

turtle.setup(width,height)//设置画布在屏幕上的位置,一般不用

画笔

turtle.pensize()//设置画笔的宽度

turtle.pencolor()//设置画笔的颜色

turtle.speed() //设置画笔的移动速度(1-10),越高越快

绘图命令

画笔运动命令

命令

说明

turtle.forward(距离)

向当前画笔方向移动距离像素长度

turtle.backward(距离)

向当前画笔反方向移动距离像素长度

turtle.right(度)

顺时针移动多少度

turtle.left(度)

逆时针移动多少

turtle.pendown()

放下笔

turtle.goto(x,y)

将画笔移动到坐标x,y的位置

turtle.penup()

提起移笔移动,不绘制图形,用于另起一个地方绘制

turtle.circle()

画圆,半径为正(负),表示圆心在画笔的左(右)边画圆

setx()

将当前X轴移动到指定位置

sety()

将当前y轴移动到指定位置

setheading(angle)

设置当前朝向为angle角度

home()

设置当前画笔位置为原点,朝向东

dot(r)

绘制一个指定直径和颜色的圆点

画笔控制命令

命令

说明

turtle.fillcolor(colorstring)

绘制图形的填充颜色

turtle.color(color1, color2)

同时设置pencolor=color1, fillcolor=color2

turtle.filling()

返回当前是否在填充状态

turtle.begin_fill()

准备开始填充图形

turtle.end_fill()

填充完成

turtle.hideturtle()

隐藏画笔的turtle形状

turtle.showturtle()

显示画笔的turtle形状

全局控制命令

命令

说明

turtle.clear()

清空turtle窗口,但是turtle的位置和状态不会改变

turtle.reset()

清空窗口,重置turtle状态为起始状态

turtle.undo()

撤销上一个turtle动作

turtle.isvisible()

返回当前turtle是否可见

stamp()

复制当前图形

turtle.write(s [,font=("font-name",font_size,"font_type")])

写文本,s为文本内容,font是字体的参数,分别为字体名称,大小和类型;font为可选项,font参数也是可选项

绘制木叶徽章

我是一个资深的影迷,所以就试着用turtle库绘制一个木叶徽章。

起初,大致一看,这应该是不规则的画圆,于是在大脑中将图案拆分成了N多线段,因为发现有的线段有圆的一部分,可以用

代码语言:javascript复制
turtle.circle()

解决 虽然麻烦了点,不过还是值得一试!于是开始了沙雕一样的自己写方法

代码语言:javascript复制
#Coding utf-8
import turtle as t
t.screensize(400,300,'white')#设置画布大小和背景色
#定义一个方法循环绘制,参数分别为:角度,像素长度,循环次数
def angler(ang,pi,would):
    for hour in range(would):
        t.right(ang)
        t.forward(pi)
#设置画笔宽度颜色速度
t.pensize(5)
t.pencolor('black')
t.speed(10)
#绘制中心点直线
t.right(50)
t.forward(25)

angler(12,5,13)

t.left(1)
t.forward(2)
angler(3,1,15)
angler(2,2,5)
angler(3,3,10)
t.circle(-30,120)
angler(1.5,2,24)
angler(5,4,18)
t.right(5)
t.forward(60)
t.right(100)
t.forward(65)
t.backward(65)
t.left(100)
t.backward(60)
#angler(25,15,4)

#t.hideturtle()
t.done()

起初想过从最后那条小尾巴开始倒着画过来的,试了一下画着不太舒服就打算从中心开始画 画出来的样子不忍直视

这个三角太小了吧!加大一点

这是个啥!!这不是我想要的木叶(╯‵□′)╯︵┴─┴

不行,照这样画下去先不说我自己想打死自己,单是影迷朋友就能打死我了 重新分析了一下图,感觉可以用螺旋线和直线来画 整个图就分为螺旋线和三条直线,先整螺旋线 But! 我数学很差劲 于是补了一下

Sin(0)=y/r Cos(0)=x/r 于是可知 x=cos(0)*r y=sin(0)*x

然后又去看了一眼斐波那契螺旋线,真的只是看了一眼就放弃了

通过

代码语言:javascript复制
x =math.sin(i*math.pi/180)*r
y =math.cos(i*math.pi/180)*r

能得到一个圆的坐标,然后根据坐标画线能画出一个圆 but,我们是要画螺旋线,在画圆的过程中逐渐扩大半径就能得到一个螺旋线 先试试康

代码语言:javascript复制
import turtle as t
import math
t.screensize(800,600)#设置画布大小
r=0
#计算XY并且累加r绘制
for i in range(360):
  x =math.sin(i*math.pi/180)*r
  y =math.cos(i*math.pi/180)*r
  t.goto(x,y)
  r =1
t.done()

然后一个螺旋线就粗来了 想要图中效果就需要对数据进行调整 一番微调之后

大体形状就是介个亚子,将线条改细小尾巴画出来

还差两条线,通过判断循环变量的值来确定是否画线,于是出现了这样的东西

还有这样的:

离真相很近了!一番改改改之后

大体形状是有了,但是多出来的那条线需要处理掉 绘制完两调直线后提笔,回到坐标点在放笔,最后再调整一下小尾巴的角度,一切的一切就达到了预期

代码如下(太懒了,就不详细说明了):

代码语言:javascript复制
import turtle as t
import math
t.screensize(800,600,'black')#设置画布大小和背景色
#设置画笔颜色宽度速度
t.pencolor('white')
t.pensize(4)
t.speed(10)

r=0
for i in range(770):
  x =math.sin(i*math.pi/180)*r
  y =math.cos(i*math.pi/180)*r
  t.goto(x,y)
  if i == 550:
    t.backward(60)
    t.right(115)
    t.backward(60)
    t.penup()
    t.goto(x, y)
    t.pendown()

  r =0.07

t.right(200)
t.forward(37)
t.hideturtle()
t.done()

0 人点赞