python绘画多边形(turtle)

目录

前言

正三角形

正四边形

正多边形

总结:


前言

事情的起因是,我今天心血来潮想让openai生成路飞的图像看效果怎么样,他是这样回我的。

 我这一想,这不稳了吗,这么轻松。结果……

import turtle

# 定义画笔颜色和大小
turtle.pensize(3)
turtle.pencolor('#000')

# 设置起始点位置
turtle.penup() # 抬起画笔
turtle.goto(0, 0) # 移动到坐标原点
turtle.pendown() # 落下画笔

# 绘制头部
turtle.circle(50)

# 绘制眼睛(左眼)
turtle.up()
turtle.goto(-20, 70)
turtle.down()
turtle.pencolor('#fff')
turtle.fillcolor('#fff')
turtle.begin_fill()
turtle.circle(15)
turtle.end_fill()

# 绘制眼珠(左)
turtle.up()
turtle.goto(-20, 80)
turtle.down()
turtle.pencolor('#000')
turtle.fillcolor('#000')
turtle.begin_fill()
turtle.circle(5)
turtle.end_fill()

# 绘制眼睛(右眼)
turtle.up()
turtle.goto(20, 70)
turtle.down()
turtle.pencolor('#fff')
turtle.fillcolor('#fff')
turtle.begin_fill()
turtle.circle(15)
turtle.end_fill()

# 绘制眼珠(右)
turtle.up()
turtle.goto(20, 80)
turtle.down()
turtle.pencolor('#000')
turtle.fillcolor('#000')
turtle.begin_fill()
turtle.circle(5)
turtle.end_fill()

# 绘制鼻子
turtle.up()
turtle.goto(0, 40)
turtle.down()
turtle.setheading(-90)
turtle.pencolor('#f00')
turtle.fillcolor('#f00')
turtle.begin_fill()
turtle.forward(20)
turtle.left(90)
turtle.forward(25)
turtle.left(90)
turtle.forward(40)
turtle.left(90)
turtle.forward(25)
turtle.left(90)
turtle.forward(20)
turtle.end_fill()

# 绘制嘴巴
turtle.pencolor('#000')
turtle.up()
turtle.goto(-30, 20)
turtle.down()
turtle.setheading(-60)
turtle.circle(35, 120)

# 绘制帽子
turtle.pencolor('#f00')
turtle.fillcolor('#f00')
turtle.up()
turtle.goto(-55, 100)
turtle.down()
turtle.begin_fill()
turtle.setheading(0)
turtle.forward(110)
turtle.setheading(90)
turtle.forward(25)
turtle.setheading(180)
turtle.forward(60)
turtle.setheading(-90)
turtle.forward(50)
turtle.setheading(180)
turtle.forward(80)
turtle.end_fill()

# 隐藏海龟
turtle.hideturtle()

# 显示画面
turtle.done()

 我的童年瞬间不完整了好吧,这肯定不同意,结果重新的询问最后得到他的另一个回答。

 哇哦~,我倒要看看有多么细节。

import turtle

# 设置画布和画笔属性
canvas = turtle.Screen()
canvas.bgcolor("#fff")
pen = turtle.Turtle()
pen.pensize(3)
pen.speed(10)
pen.ht()

# 开始绘制路飞
pen.penup()
pen.goto(0, -150)
pen.pendown()
pen.pencolor("#000")
pen.fillcolor("#f00")
pen.begin_fill()
pen.circle(150)
pen.end_fill()

# 绘制眼睛(左眼)
pen.penup()
pen.goto(-60, 40)
pen.pendown()
pen.pencolor("#fff")
pen.fillcolor("#fff")
pen.begin_fill()
pen.circle(30)
pen.end_fill()

# 绘制眼珠(左)
pen.penup()
pen.goto(-60, 60)
pen.pendown()
pen.pencolor("#000")
pen.fillcolor("#000")
pen.begin_fill()
pen.circle(10)
pen.end_fill()

# 绘制眼睛(右眼)
pen.penup()
pen.goto(60, 40)
pen.pendown()
pen.pencolor("#fff")
pen.fillcolor("#fff")
pen.begin_fill()
pen.circle(30)
pen.end_fill()

# 绘制眼珠(右)
pen.penup()
pen.goto(60, 60)
pen.pendown()
pen.pencolor("#000")
pen.fillcolor("#000")
pen.begin_fill()
pen.circle(10)
pen.end_fill()

# 绘制嘴巴
pen.penup()
pen.goto(0, -20)
pen.pendown()
pen.pencolor("#000")
pen.right(45)
pen.circle(100, 90)

# 绘制帽子
pen.penup()
pen.goto(0, 60)
pen.pendown()
pen.pencolor("#000")
pen.fillcolor("#f00")
pen.begin_fill()
pen.right(135)
pen.forward(120)
pen.right(90)
pen.forward(60)
pen.right(90)
pen.forward(80)
pen.right(90)
pen.forward(50)
pen.right(90)
pen.forward(80)
pen.right(90)
pen.forward(60)
pen.end_fill()

# 绘制帽边
pen.penup()
pen.goto(-40, 85)
pen.pendown()
pen.pencolor("#000")
pen.right(60)
pen.fillcolor("#fff")
pen.begin_fill()
pen.forward(80)
pen.right(120)
pen.forward(80)
pen.end_fill()

# 完成绘制
canvas.exitonclick()

 我好像不干净了-_-,这简直了。

于是就想自己尝试画一下,首先就是两个思路,第一找一个好绘画的图形,第二就是学习turtle方面的知识,毕竟就是第一次接触,还不知道怎么使用。

找了半天也没找到简单的图片,画曲线好像还要通过circle来画,于是就想先从绘制正多边形开始。

正三角形

python练习实战(五)-turtle库的使用_turtle.pensize_小王不叫小王叭的博客-CSDN博客https://blog.csdn.net/weixin_45573296/article/details/124032331

这里用到的几个函数都注释了他们的作用,这种笔直笔直的图形还是比较绘画的,就是先走一段距离,然后旋转角度,继续走就行了。

这个我第一次接触的东西就是这个海龟图形,他的定义就是如下所示的。

海龟图形(Turtle Graphics)是一种基于向前、向后移动、旋转和绘制等简单命令的矢量绘图系统。它最初是由Wally Feurzeig、Seymour Papert和Cynthia Solomon在1960年代初期开发的语言Logo中的一个重要组成部分。在Logo语言中,用户可以通过编写简单的命令来控制一个被称为“海龟”的图形对象,通过在屏幕上绘制直线、曲线等来创建图形图像。

Turtle Graphics在计算机图形学和计算机科学教育中广泛应用。它是一种简单且易于理解的绘图系统,适合用于初学者和儿童的教育。Turtle Graphics不仅可以用于绘制二维图形,还可以扩展到三维图形的绘制。

在现代编程语言中,也有许多Turtle Graphics的实现,例如Python语言中的turtle库。通过这些库,用户可以使用各种各样的命令和方法,来控制和绘制海龟图形,并获得类似Logo语言的绘图效果。


#画三角形
import turtle

#设置画笔粗细
turtle.pensize(3)
#设置画笔颜色
turtle.pencolor('black')

# 绘制三角形
#将海龟图形移动到画布上指定的位置(算是为了居中绘画吧)
turtle.goto(-50,0)
#在当前位置方向移动一定的距离
turtle.forward(100)
#turtle向左旋转120度
turtle.left(120)
#在当前位置方向移动一定的距离
turtle.forward(100)
#turtle向左旋转120度
turtle.left(120)
#在当前位置方向移动一定的距离
turtle.forward(100)

# 隐藏turtle图形(箭头)
turtle.hideturtle()

# 暂停程序,停止画笔绘制,但绘图窗体不关闭,直到用户关闭pythonTurtle图形化窗口为止
turtle.done()

其实这个也可以用循环来完成。原理是一样的。

# 绘制三角形
#将海龟图形移动到画布上指定的位置(算是为了居中绘画吧)
turtle.goto(-50,0)
for i in range(3):
    turtle.forward(100)
    #左转120度
    turtle.left(120)

正四边形

移动的话有些人用的是turtle.fd(100) ,有些人用的是 turtle.forward(100) 他们都表示让turtle向前移动100个像素的距离。这个看个人的习惯吧(个人理解,有错误请大佬指出

#画四边形
import turtle
#设置画笔粗细
turtle.pensize(3)
#设置画笔颜色
turtle.pencolor('black')

# 绘制四边形
#将海龟图形移动到画布上指定的位置(算是为了居中绘画吧)
turtle.goto(-50,0)
for i in range(4):
    turtle.forward(100)
    # 左转90度
    turtle.left(90)

# 隐藏turtle图形(箭头)
turtle.hideturtle()

# 暂停程序,停止画笔绘制,但绘图窗体不关闭,直到用户关闭pythonTurtle图形化窗口为止
turtle.done()

正多边形

写了这两个之后,相信大家都已经发现了规律,首先就是有很多的地方是一样的,然后就循环那里有些不同,循环的次数就是边的个数,偏转的角度就是他们的外角。

可以先由正多边形的内角和公式得到(n-2)*180,再得到每个内角就是((n-2)*180)/n;

外角就是180-((n-2)*180)/n=360/n;

那只要输入得到边数n就行了。


遇到了几个问题:

问题一:用PyCharm运行的时候画笔的界面在地下没有置顶显示,这个就很不舒服了,于是就想让他置顶输出。

如何让PyCharm的turtle窗口总在最前 | 青山绿水 (huhexian.com)https://www.huhexian.com/35025.html

#设置窗口显示置顶
turtle.Screen().getcanvas().winfo_toplevel().attributes("-topmost", True)

 问题二:我只考虑的输出,但是没有考虑输出的位置,当n取值太大的时候,整个绘制的图案就贴到边沿上面了。于是就让绘制的位置也和n有关系,整体下移一点。

#将海龟图形移动到画布上指定的位置(算是为了居中绘画吧)
turtle.goto(-50,-10*n)

问题三:turtle.goto()会有多余的线条一起画出来。这个可以先把画笔抬起,然后放下。

#将海龟笔尖提起
turtle.penup()
#将海龟图形移动到画布上指定的位置(算是为了居中绘画吧)
turtle.goto(-50,-10*n)
#将海龟笔尖落下
turtle.pendown()

 完整代码:

#绘制正多边形
import turtle

#用户输入正多边形的边长n(我们需要的是整型的数据,所以这里需要强制转换一下)
n=int(input("请输入将绘制的多边形边长:"))
#计算外角
exteriorAngle=360/n

#设置画笔粗细
turtle.pensize(3)
#设置画笔颜色
turtle.pencolor('black')
#设置窗口显示置顶
#turtle.Screen().getcanvas()返回画布对象
#winfo_toplevel()返回turtle的主窗口
#attributes("-topmost", True)置顶显示
turtle.Screen().getcanvas().winfo_toplevel().attributes("-topmost", True)

#将海龟笔尖提起
turtle.penup()
#将海龟图形移动到画布上指定的位置(算是为了居中绘画吧)
turtle.goto(-50,-15*n)
#将海龟笔尖落下
turtle.pendown()
#循环绘制
for i in range(n):
    #移动100像素?
    turtle.forward(100)
    #左转外角的角度
    turtle.left(exteriorAngle)

# 隐藏turtle图形(箭头)
turtle.hideturtle()

# 暂停程序,停止画笔绘制,但绘图窗体不关闭,直到用户关闭pythonTurtle图形化窗口为止
turtle.done()

 n=15时,其实可以设计缩小他的边长,就可以画更大的图形,形状更加接近圆形。

 

总结:

这个的话还是比较基础的,都是一些直线,有时间还是想画一下的,不过这种好像就是要花时间去找点,不知道各位大佬有没有更好的方法,还是想画动漫人物,目前看到的好像有代码,但是没有注释,不知道是不是因为注释写了也没什么用的原因,但是整个代码堆下来,还是不怎么友好的。起因就是比较有趣,虽然现在还写不出来,但是还是会朝着努力的。

希望越来越好,像今天修改的个性签名一样

你若盛开,蝴蝶自来

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

封奚泽优

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值