2016-05-01 9 views
0

Ich möchte eine smily mit Python-Turtle zeichnen. Kreis Ausmaß wird 120 Ich versuche folgendeWie zeichne Smily (Bogen) mit Python-Schildkröte

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

Problem ist Lächeln Teil. Wie zeichne ein Gesicht Lächeln?

Antwort

0

Das Modul turtle bietet keine fortschrittlichen Methoden zum Erzeugen von Bögen von Kreisen oder Parabeln, aber es ist nicht schwer, die richtigen Gleichungen zu finden.

Ein Kreis C mit Ursprung in (x0, y0) und Radius r wird durch die Gleichung beschrieben:

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

Wir können diese erweitern: Nehmen wir das zum Beispiel

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

Jetzt y als Variable und erhalten die Gleichung zweiten Grades:

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

Lassen Sie d = x^2-2x0·x+x0^2+y0^2-r^2. Wir können dieses Problem lösen die übliche Formel:

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

So, jetzt eine Funktion aufschreiben kann, die die Koordinaten der Mitte des Kreises und dem Radius gegeben, und der Wert für x es die y Koordinate zurückgibt und mit diesen Koordinaten die Schildkröte bewegen:

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 

Wie in:

>>> # bob is a turtle 
>>> bob.pendown() 
>>> for x in range(-50, 50): 
...  y1, _ = find_circle_coord(0, 0, 100, x) 
...  bob.goto(x, y1) 

Durch die Wahl einer der beiden Koordinaten zurück yo Sie wählen, ob Sie den "oberen" oder "unteren" Bogen zeichnen möchten.

um ein Lächeln zu zeichnen, müssen Sie einfach zwei Kreise mit einem kleineren und einem größeren Kreis, aber mit der Mitte leicht über dem vorherigen, so dass sie diese Art von Kreuzung haben.

So haben Sie einen Kreis C1 in x0, y0 mit Radius C2r und einem Kreis in x0, y0+K mit Radius R > r zentriert zentriert zu wählen. Beachten Sie, dass der Mittelpunkt von C2 vertikal mit C1-Zentrum ausgerichtet ist (daher die gleiche x Koordinate für das Zentrum), aber es ist darüber (Anmerkung: Ich bin mir nicht sicher von y -Achsenausrichtung so +K könnte sein ...)

Um die Kreuzungen müssen Sie lösen das System ihrer Gleichungen zu finden:

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

Nun Subtraktion der zweiten Gleichung von der ersten erhalten Sie:

(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 

Wo erhalten Sie:

y = (K^2 +2K·y0 +r^2 -R^2)/(2K) 

Und Sie können die y in einer der Kreisgleichungen ersetzen um die x s entsprechend y zu erhalten. Dann weißt du, welche x mit find_circle_coord zu zeichnen ist.

Wenn Sie den Mund offener machen möchten, können Sie einen Kreis und eine Parabel verwenden. Um den y Wert eines Punktes auf einem parabole finden es einfach:

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

Oder man könnte die Form der Gleichung einer Parabel gegeben sein Scheitel V = (xv, yv) verwenden:

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

wo a steuert, wie steil die Parabel ist.

+0

vielen dank @Bakuriu. Ich wusste nicht, dass ich zu den Grundlagen der Koordinatengeometrie zurückkehren muss. –

+0

@AmitJaiswal Es gibt vielleicht ein Paket von Drittanbietern, das diese Art von Sachen aus der Box anbietet, aber wenn man sich die Dokumentation von 'turtle' anschaut, scheint es, dass sie dies nicht bietet. Trotzdem ist es eine interessante Übung, diese Art von Funktionalität selbst zu implementieren. – Bakuriu

1

Sie können das Lächeln (und Smiley) mit den Befehlen, die das Turtle-Modul bietet, erledigen. Der Schlüssel zu Ihrem Bogen bekommen (eines Kreises) gezeichnet richtig liegt in der Kombination von goto() und setheading(), siehe unten:

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() 

Ich werde behaupten nicht gemeistert Positionierung Bögen zu haben, ich bin immer noch dabei zu viel Versuch und Irrtum, aber es ist möglich, wenn Sie sich die Zeit nehmen zu lernen, wie die Turtle-Betreiber arbeiten.

Have a nice day!