[英]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.