如何使用python龟绘制(弧形)

时间:2016-05-01 07:47:19

标签: python turtle-graphics

我想用蟒蛇龟画一个笑脸。圈数范围为120。 我正在尝试关注

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

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

3 个答案:

答案 0 :(得分:3)

你可以使用海龟模块提供的命令来做笑脸(和笑脸)。正确绘制圆弧(圆圈)的关键在于using Newtonsoft.Json.Linq;goto()的组合,见下文:

setheading()

我不会声称已经掌握了定位弧,我仍然做了太多的试验和错误,但是如果你花时间去了解龟操作员是如何工作的话,这是有可能的。

Have a nice day!

答案 1 :(得分:0)

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

原点C和半径(x0, y0)的圈r由等式描述:

(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 - 轴方向所以{{ 1}}可能是+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绘制哪个x

如果你想让嘴巴更开放,你可以使用圆形和抛物线。要在一个抛物线上找到一个点的find_circle_coord值,这很容易:

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 控制抛物线的陡峭程度。

答案 2 :(得分:0)

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)