2016-05-01 95 views
0

我想用蟒蛇绘制一个笑脸。圆的程度将是120 我想以下如何使用蟒蛇绘制笑脸(弧线)

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

问题是微笑的一部分。如何绘制脸部微笑?

回答

0

turtle模块不提供圆弧或抛物线圆弧的高级方法,但不难想出正确的方程。

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

我们可以展开此得到:

的圆C与原点(x0, y0)和半径r由方程描述

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) 

通过选择两个坐标之一返回哟你选择是否绘制“上”或“下”弧线。

要画出一个微笑,你只需要想出两个圆形,一个更小,一个更大,但中心略高于前一个,这样它们就有了这种交集。

所以,你必须选择集中在x0, y0半径r和集中在x0, y0+K半径R > rC2一圈C1。 请注意,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代替其中一个圆方程以获得对应于这样的yx。那么你知道使用find_circle_coord来绘制哪个x

如果你想让口更开放,你可以使用圆和抛物线。要找到一个parabole一个点的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控制如何陡峭的抛物线是。

+0

非常感谢@Bakuriu。我没有意识到我需要回到坐标几何的基础知识。 –

+0

@AmitJaiswal可能有一些第三方包提供了这些东西,但看着'turtle'的文档,它似乎没有提供这种东西。无论如何,自己实现这种功能是一个有趣的练习。 – Bakuriu

1

你可以用乌龟模块提供的命令来做笑容(和笑脸)。让你的正常拉弧(圆)的关键在于在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() 

我不会要求有掌握定位弧线,我还在做试验和错误太多,但如果你花时间学习海龟操作者的工作方式,那么这是可能的。

Have a nice day!