ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

给家人们整无语了!教你用Python绘制流汗黄豆

2021-05-22 17:33:00  阅读:1389  来源: 互联网

标签:turtle Python 教你用 param 整无语 绘制 circle math fill


一、需要用到的库

import turtle
import math

turtle库用于绘制图形,math库主要用于确定图形的方程

二、图形分析
流汗黄豆
整个图形由轮廓眼睛嘴巴汗滴四部分组成。可以看见,轮廓是一个圆;眼睛的上半部分是一个半椭圆,下半部分是一个半圆;嘴巴的上半部分是一段圆弧,下半部分是一个半圆;汗滴可以看作一个240度的圆周以及端点处的两条切线组成。
在这里,我将整个轮廓的半径定为100个像素,定圆心为(0,0)。使用ppt中的标尺工具(在绘图工具条中)测量出各部分的比例,计算出长度,确定坐标,开始绘制。在这里就不展示我的测量结果了(写得很乱),反正在代码中都有体现,大家可以自行测量。
ppt中的标尺工具

三、绘制代码分析
首先,总体图形的大小大概在200×200左右,所以将画布的大小设置为400×400

turtle.setup(400, 400)

3.1 轮廓的绘制
轮廓就是一个圆,没什么好说的,turtle中的circle()函数可以用来画圆。值得注意的是,circle函数画圆是从圆的最下方开始画,所以我们先将圆心设置为(0,0):

# 将圆心设置为(0,0)
turtle.penup()
turtle.sety(-100)
turtle.pendown()

然后就可以开始画圆了 :这里需要主要的是填充图案要以begin_fill()函数开始,以end_fill()函数结尾

# 画一个黄色的圆形
turtle.begin_fill()
turtle.fillcolor('yellow')
turtle.circle(100)
turtle.end_fill()

画出的圆结果如下图:
在这里插入图片描述

3.2 眼睛的绘制
前面说过,眼睛的上半部分是椭圆,所以要画眼睛,就得解决画椭圆。
由小学二年级的数学,我们知道,椭圆的参数方程为:
椭圆参数方程
所以,要画椭圆,我们得知道圆心坐标(x,y)长短半轴长度a,b,在Python中,我选择画一个扁的n边形,只要n足够大,就能形成一个椭圆,所以还需要知道边数n,有了这五个参数,我们首先定义一个画半个椭圆的函数。边数暂时设为500,如有需要可以加大(此处将起始点的坐标设置为(x,y),很容易得到圆心坐标就是(x-a,y)):

def half_ellipse(a, b, x, y, n=500):
    """
    绘制半个椭圆函数
    :param a: 长半轴长度
    :param b: 短半轴长度
    :param n: 边的数目 -- n越大,越趋近于椭圆
    :param x:起始绘制点的横坐标
    :param y:起始绘制点的纵坐标
    """

然后,将画笔调整至开始绘制半椭圆的位置:

 turtle.penup()
 turtle.setpos(x, y)  # 初始点的位置
 turtle.pendown()

按照椭圆的参数方程开始画:

for i in range(n):  # 画扁的n边形。当n --> 无穷大,所画出的图形即为椭圆
    radian = 2 * math.pi / n  # 将2pi弧度分成n份,每份为radian
    theta = (i + 1) * radian  # 每次弧度增加radian
    next_point = (a * math.cos(theta) + x - a, b * math.sin(theta) + y)
    turtle.setpos(next_point)

到一半的时候就停止:

if i == n / 2:
    break

总的绘制半椭圆函数代码如下:

def half_ellipse(a, b, x, y, n=500):
    """
    绘制半个椭圆函数
    :param a: 长半轴长度
    :param b: 短半轴长度
    :param n: 边的数目 -- n越大,越趋近于椭圆
    :param x:起始绘制点的横坐标
    :param y:起始绘制点的纵坐标
    """
    turtle.penup()
    turtle.setpos(x, y)  # 初始点的位置
    turtle.pendown()
    for i in range(n):  # 画扁的n边形。当n --> 无穷大,所画出的图形即为椭圆
        radian = 2 * math.pi / n  # 将2pi弧度分成n份,每份为radian
        theta = (i + 1) * radian  # 每次弧度增加radian
        next_point = (a * math.cos(theta) + x - a, b * math.sin(theta) + y)
        turtle.setpos(next_point)
        if i == n / 2:
            break

解决了绘制椭圆的问题之后,就可以开始绘制眼睛了,上方是一个椭圆,下方是一个圆,调整好参数后很容易就可以画出来:

# 开始画眼睛
# 左眼
turtle.begin_fill()
turtle.fillcolor('brown')
half_ellipse(15, 35, -12.5, 7.5)
turtle.seth(-90)
turtle.circle(15, -180)
turtle.end_fill()

画右眼道理也相同,见源代码。画出来的结果如下图:
在这里插入图片描述
3.3 嘴巴的绘制
嘴巴其实是最难画的,因为嘴巴的下半部分很容易,是一个半圆,但是上半部分就很难获得参数了,在ppt中,我用一个圆形去拟合,最终得出了上半部分是一个半径为210像素,圆心角为36度的圆弧。
所以,只需绘制这两段圆弧然后用棕色填充即可:

# 开始画嘴巴
turtle.begin_fill()
turtle.fillcolor('brown')
turtle.penup()
turtle.setpos(-65, -5)
turtle.pendown()
turtle.seth(-90)
turtle.circle(65, 180)
turtle.seth(18)
turtle.circle(210, -36)
turtle.end_fill()

画出来的结果如下图,是不是有内味了?
在这里插入图片描述
3.4 汗滴的绘制
汗滴很简单,就是一个240度的圆弧加上两条切线,很容易就能画出来,代码如下:

# 开始画流汗
turtle.begin_fill()
turtle.fillcolor('blue')
turtle.penup()
turtle.setpos(70, 55)
turtle.pendown()
turtle.seth(-120)
turtle.circle(22.5, 240)
turtle.forward(22.5 * math.sqrt(3))
turtle.seth(-120)
turtle.forward(22.5 * math.sqrt(3))
turtle.end_fill()

这样,一个流汗黄豆基本上画完了,最后,隐藏画笔,再使画布悬停。值得注意的是,在pycharm中,要加上turtle.done()这行代码才能使画布悬停,而直接使用Python的IDLE的话,无需这行代码就能自动悬停

turtle.hideturtle()
turtle.done()

最终的效果如下图,不能说很相似,只能说一模一样
在这里插入图片描述
四、感想感悟
最近状态真的有些不好,接二连三的大作业,各种编程,人已经是晕晕乎乎的了,怎么会有一门课分为两门早八啊!!!四学分的概率论,两节早八,笑死,根本起不来。还有这个概率论老师,我是真的无语了,一节课点两次名,不想给平时分就直说嘛,我寻思着,一门课难道不是以学到知识为目的吗?看考试成绩不就行了,点啥名啊?于是我有感而发,写下了这段代码,字里行间都充满着无语,我是真的无语了。不过码完这篇文章后,心情舒畅多了,看来吐槽是真的有用。

五、源代码
最后把绘制流汗黄豆的代码整合成了一个函数,很多地方做得不好,有意见或者建议,欢迎来与我讨论。

import turtle
import math


def half_ellipse(a, b, x, y, n=500):
    """
    绘制半个椭圆函数
    :param a: 长半轴长度
    :param b: 短半轴长度
    :param n: 边的数目 -- n越大,越趋近于椭圆
    :param x:起始绘制点的横坐标
    :param y:起始绘制点的纵坐标
    """
    turtle.penup()
    turtle.setpos(x, y)  # 初始点的位置
    turtle.pendown()
    for i in range(n):  # 画扁的n边形。当n --> 无穷大,所画出的图形即为椭圆
        radian = 2 * math.pi / n  # 将2pi弧度分成n份,每份为radian
        theta = (i + 1) * radian  # 每次弧度增加radian
        next_point = (a * math.cos(theta) + x - a, b * math.sin(theta) + y)
        turtle.setpos(next_point)
        if i == n / 2:
            break


def draw_liuhanhuangdou():
    turtle.setup(400, 400)
    # 将圆心设置为(0,0)
    turtle.penup()
    turtle.sety(-100)
    turtle.pendown()

    # 画一个黄色的圆形
    turtle.begin_fill()
    turtle.fillcolor('yellow')
    turtle.circle(100)
    turtle.end_fill()

    # 开始画眼睛
    # 左眼
    turtle.begin_fill()
    turtle.fillcolor('brown')
    half_ellipse(15, 35, -12.5, 7.5)
    turtle.seth(-90)
    turtle.circle(15, -180)
    turtle.end_fill()
    # 右眼
    turtle.begin_fill()
    turtle.fillcolor('brown')
    half_ellipse(15, 35, 42.5, 7.5)
    turtle.seth(-90)
    turtle.circle(15, -180)
    turtle.end_fill()

    # 开始画嘴巴
    turtle.begin_fill()
    turtle.fillcolor('brown')
    turtle.penup()
    turtle.setpos(-65, -5)
    turtle.pendown()
    turtle.seth(-90)
    turtle.circle(65, 180)
    turtle.seth(18)
    turtle.circle(210, -36)
    turtle.end_fill()

    # 开始画流汗
    turtle.begin_fill()
    turtle.fillcolor('blue')
    turtle.penup()
    turtle.setpos(70, 55)
    turtle.pendown()
    turtle.seth(-120)
    turtle.circle(22.5, 240)
    turtle.forward(22.5 * math.sqrt(3))
    turtle.seth(-120)
    turtle.forward(22.5 * math.sqrt(3))
    turtle.end_fill()

    # 隐藏画笔,并使幕布悬停
    turtle.hideturtle()
    turtle.done()


def main():
    draw_liuhanhuangdou()


if __name__ == '__main__':
    main()

标签:turtle,Python,教你用,param,整无语,绘制,circle,math,fill
来源: https://blog.csdn.net/firm_mabu/article/details/117159345

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有