我想用蟒蛇繪製一個笑臉。圓的程度將是120 我想以下如何使用蟒蛇繪製笑臉(弧線)
import turtle
turtle.circle(100)
turtle.up()
turtle.goto(0, 30)
turtle.down()
turtle.circle(40, 120)
問題是微笑的一部分。如何繪製臉部微笑?
我想用蟒蛇繪製一個笑臉。圓的程度將是120 我想以下如何使用蟒蛇繪製笑臉(弧線)
import turtle
turtle.circle(100)
turtle.up()
turtle.goto(0, 30)
turtle.down()
turtle.circle(40, 120)
問題是微笑的一部分。如何繪製臉部微笑?
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 > r
圓C2
一圈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
代替其中一個圓方程以獲得對應於這樣的y
的x
。那麼你知道使用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
控制如何陡峭的拋物線是。
你可以用烏龜模塊提供的命令來做笑容(和笑臉)。讓你的正常拉弧(圓)的關鍵在於在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()
我不會要求有掌握定位弧線,我還在做試驗和錯誤太多,但如果你花時間學習海龜操作者的工作方式,那麼這是可能的。
非常感謝@Bakuriu。我沒有意識到我需要回到座標幾何的基礎知識。 –
@AmitJaiswal可能有一些第三方包提供了這些東西,但看着'turtle'的文檔,它似乎沒有提供這種東西。無論如何,自己實現這種功能是一個有趣的練習。 – Bakuriu