繁体   English   中英

如何使用python turtle绘制smily(arc)

[英]How to draw smily (arc) using python turtle

我想用python turtle画一个笑脸。 圈子范围将为120。我正在尝试关注

import turtle
turtle.circle(100)
turtle.up()
turtle.goto(0, 30)
turtle.down()
turtle.circle(40, 120)

问题是微笑部分。 如何画一个笑脸?

您可以使用turtle模块提供的命令进行微笑(和笑脸)。 正确绘制圆弧的关键在于goto()setheading()的组合,请参见下文:

import turtle

turtle.up()
turtle.goto(0, -100)  # center circle around origin
turtle.down()

turtle.begin_fill()
turtle.fillcolor("yellow")  # draw head
turtle.circle(100)
turtle.end_fill()

turtle.up()
turtle.goto(-67, -40)
turtle.setheading(-60)
turtle.width(5)
turtle.down()
turtle.circle(80, 120)  # draw smile

turtle.fillcolor("black")

for i in range(-35, 105, 70):
    turtle.up()
    turtle.goto(i, 35)
    turtle.setheading(0)
    turtle.down()
    turtle.begin_fill()
    turtle.circle(10)  # draw eyes
    turtle.end_fill()

turtle.hideturtle()
turtle.done()

我不会声称自己掌握了定位弧,我仍然在进行过多的反复试验,但是如果您花时间学习乌龟操作员的工作方式,则有可能。

祝你今天愉快!

turtle模块不提供绘制圆弧或抛物线弧的高级方法,但是要找到正确的方程式并不难。

(x0, y0)为原点且半径为r的圆C由以下方程式表示:

(x-x0)^2 + (y-y0)^2 = r^2

我们可以将其扩展为:

x^2 -2x·x0 + x0^2 + y^2 -2y·y0 + y0^2 - r^2 = 0

现在我们可以将y作为变量,并获得第二级方程:

y^2 -2y0·y +(x^2-2x0·x+x0^2+y0^2-r^2) = 0

d = x^2-2x0·x+x0^2+y0^2-r^2 我们可以使用通常的公式解决此问题:

y1 = (2y0 + sqrt(4y0^2 - 4d))/2 = y0 + sqrt(y0^2 - d)
y2 = (2y0 - sqrt(4y0^2 - 4d))/2 = y0 - sqrt(y0^2 - d)

因此,现在您可以写下一个函数,给定圆心和半径的坐标,以及x的值,它返回坐标y并使用这些坐标移动乌龟:

def find_circle_coord(x0, y0, r, x):
    d = x**2 - 2*x0*x + x0**2 + y0**2 - r**2
    D = y0**2 - d
    if D < 0:
        raise ValueError("Value for x is outside the circle!")
    return y0 - D**.5, y0 + D**.5

如:

>>> # bob is a turtle
>>> bob.pendown()
>>> for x in range(-50, 50):
...     y1, _ = find_circle_coord(0, 0, 100, x)
...     bob.goto(x, y1)

通过选择返回的两个坐标之一,您可以选择绘制“上”弧还是“下”弧。

要画出一个微笑,您只需要拿出两个圆圈,一个小一点,一个大一点,但中心稍高于前一个,这样它们就可以交汇了。

因此,你必须选择一个圆C1在居中x0, y0半径r和一个圆C2为中心x0, y0+K与半径R > r 请注意,C2的中心与C1的中心垂直对齐(因此,该中心的x坐标相同),但是它在它的上方(注意:我不确定y轴的方向,因此+K可能是-K ...)

要找到相交点,您必须解方程组:

(x-x0)^2 + (y-y0)^2-r^2 = 0
(x-x0^2) + (y-y0-K)^2-R^2 = 0

现在从第一个方程式减去第二个方程式:

(y-y0)^2 - (y-y0-K)^2 -r^2 + R^2 = 0
y^2 -2y·y0 +y0^2 - y^2 -y0^2 -K^2 +2y·y0 +2K·y -2K·y0 -r^2 + R^2 = 0
-K^2 +2K·y -2K·y0 -r^2 + R^2 = 0

您在哪里:

y = (K^2 +2K·y0 +r^2 -R^2)/(2K)

并且可以替换为y在圆方程之一,以获得x对应于这样的小号y 然后,您可以使用find_circle_coord知道要绘制哪个x

如果要使嘴更张开,可以使用圆和抛物线。 在抛物线上找到点的y值很容易:

def find_parabola_coord(a, b, c, x):
    return a*x**2 + b*x + c

或者您可以使用抛物线方程的形式,给定其顶点V = (xv, yv)

y - yv = a(x - xv)^2

其中a控制抛物线是多么陡峭。

import turtle
bob = turtle.Turtle()
bob.circle(100)
bob.penup()
bob.goto(50,100)
bob.pendown()
bob.circle(10)
bob.penup()
bob.goto(-50,100)
bob.pendown()
bob.circle(10)
bob.penup()
bob.goto(0,50)
bob.pendown()
bob.circle(100,30)
bob.penup()
bob.goto(0,50)
bob.pendown()
bob.circle(0,-30)
bob.circle(100,-30)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM