2016-05-01 22 views
0

パイソンカメを使ってスマイルを描きたいと思います。サークルの範囲は、私がしようとしている120 なりますパイソンカメを使ってスミル(円弧)を描く方法

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

次の問題は、一部の笑顔です。どのように顔の笑顔を描く?

答えて

0

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を取ることができます2次方程式を得る:

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

Let d = x^2-2x0·x+x0^2+y0^2-r^2。私たちは、いつもの式を使用してこの問題を解決することができます。だから今あなたがxのために円の中心と半径の座標与え、機能、および値を書き留めることができ、それは座標yを返し

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

をし、カメを移動するためにこれらの座標を使用します。同様に

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) 

2つの座標のいずれかを選択することでヨーヨーを返さ「上」または「下」の円弧を描くかどうかを選択します。

笑顔を描くには、2つの円を1つ小さくして大きなものを出すだけですが、前のものよりわずかに上に中央があるので、そのような交差点があります。

だから、半径rと半径R > rx0, y0+Kを中心とする円C2x0, y0を中心とする円C1を選択する必要があります。 C2の中心がC1中心に垂直に配置されていることに注意してください(それで、中心の座標はxと同じですが、それは上です)。y軸の向きがわからないのでは-K ...)

あなたは自分の方程式を解くために持っている交差点を見つけるために:

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

今、最初のあなたが得るからの第2式引い:

あなたが得る
(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) 

円の方程式の1つにyを代入することができますそのようなyに対応するxを得る。それでfind_circle_coordを使って描画するのはxです。

口をもっと開いてみたい場合は、円と放物線を使うことができます。

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

それとも、その頂点V = (xv, yv)与えられた放物線の方程式の形式を使用できます:放物型その上の点のy値を見つけるには簡単だ

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

a制御方法を急放物線がある。

+0

おかげでたくさん@Bakuriu。私は、座標ジオメトリの基本に戻る必要があることを理解していませんでした。 –

+0

@AmitJaiswalこのような種類のものを用意しているサードパーティのパッケージがあるかもしれませんが、これを提供していないような "カメ"のドキュメントを見ると、とにかく、この種の機能を自分で実装するのは興味深い練習です。 – 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!