Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Dreieck zeichnen so einfach wie möglich

456 views
Skip to first unread message

Benedikt Schwarz

unread,
Apr 7, 2013, 10:51:27 AM4/7/13
to
Hallo,

wie zeichnet man in Python am einfachsten ein Dreieck?

Mit Tkinter oder Pygame habe ich zwar schon entsprechenden Beispielcode
ergoogelt, aber so richtig selbsterklärend war das dann doch nicht. Am
liebsten würde ich nur 2 Längen (a, b) und einen Winkel (alpha) angeben
und die restliche Arbeit der Funktion überlassen.


Gruß
Benedikt Schwarz

Peter Otten

unread,
Apr 7, 2013, 11:20:53 AM4/7/13
to pyth...@starship.python.net
Benedikt Schwarz wrote:

> wie zeichnet man in Python am einfachsten ein Dreieck?

Man spezifiziert die drei Eckpunkte und zeichnet dann Strecken zwischen
allen Punkt-Kombinationen.

> Mit Tkinter oder Pygame habe ich zwar schon entsprechenden Beispielcode
> ergoogelt, aber so richtig selbsterklärend war das dann doch nicht. Am
> liebsten würde ich nur 2 Längen (a, b) und einen Winkel (alpha) angeben
> und die restliche Arbeit der Funktion überlassen.

Nach der gängigen Nomenklatur (der Punkt A und der Winkel alpha liegen der
Seite a gegenüber)

http://de.wikipedia.org/wiki/Dreieck

kann es dafür zwei Lösungen geben. Stell dir vor, du zeichnest c "unendlich"
lang und findest dann B als Schnittpunkt von c mit einem Kreis mit dem
Radius a um C.

Außerdem musst du auch noch irgendwie die Position des Dreiecks auf der
Zeichenfläche (Canvas in Tkinter) festlegen.

Benedikt Schwarz

unread,
Apr 7, 2013, 1:58:58 PM4/7/13
to
Am 07.04.2013 17:20, schrieb Peter Otten:
> Benedikt Schwarz wrote:
>
>> wie zeichnet man in Python am einfachsten ein Dreieck?
>
> Man spezifiziert die drei Eckpunkte und zeichnet dann Strecken zwischen
> allen Punkt-Kombinationen.

Aber so eine richtige Funktion zum Dreieckzeichnen gibt es anscheinend
nicht?


> Außerdem musst du auch noch irgendwie die Position des Dreiecks auf der
> Zeichenfläche (Canvas in Tkinter) festlegen.

Längste Seite = Grundlinie. Kann man das so einfach festlegen?


Gruß
Benedikt Schwarz

Reimar Bauer

unread,
Apr 7, 2013, 2:39:40 PM4/7/13
to Benedikt Schwarz, Die Deutsche Python Mailingliste
Moin


2013/4/7 Benedikt Schwarz <bew...@gmx.com>

Am 07.04.2013 17:20, schrieb Peter Otten:
Benedikt Schwarz wrote:

wie zeichnet man in Python am einfachsten ein Dreieck?

Man spezifiziert die drei Eckpunkte und zeichnet dann Strecken zwischen
allen Punkt-Kombinationen.

Aber so eine richtige Funktion zum Dreieckzeichnen gibt es anscheinend nicht?

 
Noch eine andere Möglichkeit gibts mit  Turtels z.B.
http://www.handysoftware.com/cpif/docs/CPIF-Lesson-13.pdf

Gruß
Reimar


Außerdem musst du auch noch irgendwie die Position des Dreiecks auf der
Zeichenfläche (Canvas in Tkinter) festlegen.

Längste Seite = Grundlinie. Kann man das so einfach festlegen?



Gruß
Benedikt Schwarz
_______________________________________________
python-de maillist  -  pyth...@python.org
http://mail.python.org/mailman/listinfo/python-de

Benedikt Schwarz

unread,
Apr 7, 2013, 2:47:05 PM4/7/13
to
Hallo Reimar,

Am 07.04.2013 20:39, schrieb Reimar Bauer:
> Moin
>
>
> 2013/4/7 Benedikt Schwarz <bew...@gmx.com <mailto:bew...@gmx.com>>
>
> Am 07.04.2013 17:20, schrieb Peter Otten:
>
> Benedikt Schwarz wrote:
>
> wie zeichnet man in Python am einfachsten ein Dreieck?
>
>
> Man spezifiziert die drei Eckpunkte und zeichnet dann Strecken
> zwischen
> allen Punkt-Kombinationen.
>
>
> Aber so eine richtige Funktion zum Dreieckzeichnen gibt es
> anscheinend nicht?
>
> Noch eine andere Möglichkeit gibts mit Turtels z.B.
> http://www.handysoftware.com/cpif/docs/CPIF-Lesson-13.pdf

Das kommt meinen Vorstellungen von einer speziellen Funktion zum
Dreieckzeichnen bisher am nächsten, aber kann man damit auch
unregelmäßige Dreiecke zeichnen?


Gruß
Benedikt Schwarz

Reimar Bauer

unread,
Apr 7, 2013, 4:47:55 PM4/7/13
to Benedikt Schwarz, Die Deutsche Python Mailingliste
Mit dem Beispiel in dem Script nicht, mit turtle ja.
Hab aber auch kein fertiges Beispiel an der Hand.
Evtl. ist das noch was hilfreiches zu finden,
http://openbookproject.net/thinkcs/python/english3e/hello_little_turtles.html

Gruß
Reimar


2013/4/7 Benedikt Schwarz <bew...@gmx.com>



Gruß
Benedikt Schwarz

Peter Otten

unread,
Apr 7, 2013, 3:50:01 PM4/7/13
to pyth...@starship.python.net
Benedikt Schwarz wrote:

> Am 07.04.2013 17:20, schrieb Peter Otten:
>> Benedikt Schwarz wrote:
>>
>>> wie zeichnet man in Python am einfachsten ein Dreieck?
>>
>> Man spezifiziert die drei Eckpunkte und zeichnet dann Strecken zwischen
>> allen Punkt-Kombinationen.
>
> Aber so eine richtige Funktion zum Dreieckzeichnen gibt es anscheinend
> nicht?

Canvas.create_polygon() kann beliebige Vielecke zeichnen. Hier zum Beispiel
ein Dreieck:

import Tkinter as tk

WIDTH = 600
HEIGHT = 300

root = tk.Tk()

canvas = tk.Canvas(root, width=WIDTH, height=HEIGHT)
canvas.pack()

canvas.create_polygon(
(0, HEIGHT),
(500, HEIGHT),
(400, HEIGHT-200))

root.mainloop()

>> Außerdem musst du auch noch irgendwie die Position des Dreiecks auf der
>> Zeichenfläche (Canvas in Tkinter) festlegen.
>
> Längste Seite = Grundlinie. Kann man das so einfach festlegen?

Ich versteh die Frage nicht. Wenn du das Dreieck nicht durch die Koordinaten
der Ecken definieren willst, musst du dich mit der Mathematik dahinter
beschäftigen. Mehr als sin, cos und Pythagoras brauchts dafür aber wohl
nicht. Zum Beispiel:

from math import sin, cos, radians, sqrt

def draw_triangle(a, b, alpha, color="blue"):
alpha = radians(alpha)
p = b*cos(alpha)
h = b*sin(alpha)
q = sqrt(a*a-h*h)

A = (0, HEIGHT)
B = (p+q, HEIGHT)
C = (p, HEIGHT-h)

canvas.create_polygon(A, B, C, fill=color)

draw_triangle(500, 300, 45, "red")


Diez Roggisch

unread,
Apr 8, 2013, 5:57:48 AM4/8/13
to Peter Otten, pyth...@starship.python.net
>
>Ich versteh die Frage nicht. Wenn du das Dreieck nicht durch die
>Koordinaten
>der Ecken definieren willst, musst du dich mit der Mathematik dahinter
>beschäftigen. Mehr als sin, cos und Pythagoras brauchts dafür aber wohl
>nicht. Zum Beispiel:

Ich glaube Benedikt will etwas deklaratives. Einfach drei Kriterien
angeben, und das Ergebnis ist wie gewünscht.

Das ist halt mit Computern notorisch schwierig, Benedikt. Die sind
ziemlich blöde, und können nicht sowas wie "male ein Dreieck so, wie der
Lehrer es in der Schule auch immer tut".

Da musst du schon selbst ran, und Vorgaben machen. ZB bei rechtwinkligen
Dreiecken immer die Katheten achsenparallel zeichnen usw. Das nimmt einem
niemand ab.

Diez


Thomas Lenarz

unread,
Apr 8, 2013, 1:23:04 PM4/8/13
to pyth...@python.org
Am 07.04.2013 16:51, schrieb Benedikt Schwarz:
> wie zeichnet man in Python am einfachsten ein Dreieck?
>
> Mit Tkinter oder Pygame habe ich zwar schon entsprechenden Beispielcode
> ergoogelt, aber so richtig selbsterkl�rend war das dann doch nicht. Am
> liebsten w�rde ich nur 2 L�ngen (a, b) und einen Winkel (alpha) angeben
> und die restliche Arbeit der Funktion �berlassen.

Das ist eine interessante Frage. Habe auch mal in die alte
Formelsammlung geguckt und dachte erst. Hmm! Ohne Trigonometrie nicht
hinzubekommen. Die Idee von Reimar mit der Turtlegrafik ist da nat�rlich
der richtige Weg:

Wenn man z.B.: ein Dreieck zeichnen m�chte, dass durch zwei Strecken
a=55 und b=77 in einem Winkel von 66 aufgespannt wird, k�nnte man es wie
folgt angehen:

>>> import turtle
>>> turtle.forward(55)
>>> turtle.left(180-66)
>>> turtle.forward(77)
>>> turtle.goto( (0,0) )

Die Schildkr�te f�ngt am Punkt (0,0) an zu laufen. Der Winkel ist dann
eben irgendwo in der Mitte der zur�ckgelegten Strecke.
Das absolute "goto" zum Ursprungspunkt ist, glaube ich, wenig
"turtelig". Ich wei� nicht, ob Logo das fr�her beherschte. Aber es ist
effektiv.... ;-)

Man kann die Schilkr�te nat�rlich vor der Zeichen-Aktion mit
eingezogenem Stift erst einmal an eine absolute Position stellen und auf
einen bestimmten Winkel drehen. So kann man dann die Lage des Dreiecks
auf der Fl�che bestimmen.

Liebe Gr��e
Thomas


--
mailto:thomas...@netcologne.de
http://twitter.com/tommesl

Benedikt Schwarz

unread,
Apr 8, 2013, 2:43:39 PM4/8/13
to
Am 07.04.2013 21:50, schrieb Peter Otten:
> Benedikt Schwarz wrote:
>
>> Am 07.04.2013 17:20, schrieb Peter Otten:
>>> Außerdem musst du auch noch irgendwie die Position des Dreiecks auf der
>>> Zeichenfläche (Canvas in Tkinter) festlegen.
>>
>> Längste Seite = Grundlinie. Kann man das so einfach festlegen?
>
> Ich versteh die Frage nicht. Wenn du das Dreieck nicht durch die Koordinaten
> der Ecken definieren willst, musst du dich mit der Mathematik dahinter
> beschäftigen. Mehr als sin, cos und Pythagoras brauchts dafür aber wohl
> nicht.

Ja, genau so wäre es perfekt. Mit sin, cos und Pythagoras habe ich kein
Problem, wobei der Satz des Pythagoras ja nur für rechtwinklige Dreiecke
geeignet ist.


> Zum Beispiel:
>
> from math import sin, cos, radians, sqrt
>
> def draw_triangle(a, b, alpha, color="blue"):
> alpha = radians(alpha)
> p = b*cos(alpha)
> h = b*sin(alpha)
> q = sqrt(a*a-h*h)
>
> A = (0, HEIGHT)
> B = (p+q, HEIGHT)
> C = (p, HEIGHT-h)
>
> canvas.create_polygon(A, B, C, fill=color)
>
> draw_triangle(500, 300, 45, "red")

Vielen Dank für den Beispielcode.


Gruß
Benedikt Schwarz

Benedikt Schwarz

unread,
Apr 8, 2013, 2:58:12 PM4/8/13
to
Am 08.04.2013 19:23, schrieb Thomas Lenarz:
> Am 07.04.2013 16:51, schrieb Benedikt Schwarz:
>> wie zeichnet man in Python am einfachsten ein Dreieck?
>>
>> Mit Tkinter oder Pygame habe ich zwar schon entsprechenden Beispielcode
>> ergoogelt, aber so richtig selbsterklärend war das dann doch nicht. Am
>> liebsten würde ich nur 2 Längen (a, b) und einen Winkel (alpha) angeben
>> und die restliche Arbeit der Funktion überlassen.
>
> Das ist eine interessante Frage. Habe auch mal in die alte
> Formelsammlung geguckt und dachte erst. Hmm! Ohne Trigonometrie nicht
> hinzubekommen. Die Idee von Reimar mit der Turtlegrafik ist da natürlich
> der richtige Weg:
>
> Wenn man z.B.: ein Dreieck zeichnen möchte, dass durch zwei Strecken
> a=55 und b=77 in einem Winkel von 66 aufgespannt wird, könnte man es wie
> folgt angehen:
>
>>>> import turtle
>>>> turtle.forward(55)
>>>> turtle.left(180-66)
>>>> turtle.forward(77)
>>>> turtle.goto( (0,0) )
>
> Die Schildkröte fängt am Punkt (0,0) an zu laufen. Der Winkel ist dann
> eben irgendwo in der Mitte der zurückgelegten Strecke.
> Das absolute "goto" zum Ursprungspunkt ist, glaube ich, wenig
> "turtelig". Ich weiß nicht, ob Logo das früher beherschte. Aber es ist
> effektiv.... ;-)

Man kommt damit bestimmt schneller und einfacher ans Ziel als alle
Eckpunkte/Seitenlängen eines Dreiecks mithilfe von Winkelfunktionen zu
bestimmen.

Nur was macht man, wenn kein Winkel, sondern alle 3 Seitenlängen gegeben
sind?


> Man kann die Schilkröte natürlich vor der Zeichen-Aktion mit
> eingezogenem Stift erst einmal an eine absolute Position stellen und auf
> einen bestimmten Winkel drehen. So kann man dann die Lage des Dreiecks
> auf der Fläche bestimmen.

Was meinst du mit "eingezogenem Stift"?


Gruß
Benedikt Schwarz

Marek Kubica

unread,
Apr 9, 2013, 5:32:27 AM4/9/13
to pyth...@python.org
On Mon, 08 Apr 2013 20:58:12 +0200
Benedikt Schwarz <bew...@gmx.com> wrote:

> Man kommt damit bestimmt schneller und einfacher ans Ziel als alle
> Eckpunkte/Seitenlängen eines Dreiecks mithilfe von Winkelfunktionen
> zu bestimmen.
>
> Nur was macht man, wenn kein Winkel, sondern alle 3 Seitenlängen
> gegeben sind?

Dann wird man wohl rechnen müssen. Turtle ist ja letztendlich nur ne
implementierung von "durch frischen Schnee laufen und Fußspuren
hinterlassen". Außer verschiedene Richtungen gehen und sich drehen kann
sie nicht viel mehr.

> > Man kann die Schilkröte natürlich vor der Zeichen-Aktion mit
> > eingezogenem Stift erst einmal an eine absolute Position stellen
> > und auf einen bestimmten Winkel drehen. So kann man dann die Lage
> > des Dreiecks auf der Fläche bestimmen.
>
> Was meinst du mit "eingezogenem Stift"?

Turtle hinterlässt beim Abfahren der Strecke eine Spur, wie eben die
Fußspuren in Schnee. Aber die Python-Turtle kann halt eben auch fliegen
ohne Fußspuren zu hinterlassen, ergo liegt der Stift nicht auf dem
Papier, ist also eingezogen :D

Warum die Python-Turtle fliegen kann erklärt xkcd:
<https://xkcd.com/353/>

grüße,
Marek

Reimar Bauer

unread,
Apr 9, 2013, 3:14:50 PM4/9/13
to Benedikt Schwarz, Die Deutsche Python Mailingliste



2013/4/8 Benedikt Schwarz <bew...@gmx.com>
Lass  mal überlegen, also wenn man es partout nicht ausrechnen will, dann kann man ja die Seiten A mit B und B mit C nicht starr verbinden.
Dann fixiert man A und bewegt das Ende von C auf den Anfang von A.
Das ergibt automatisch das durch die Längen vorgegebene Dreieck.

Reimar






Man kann die Schilkröte natürlich vor der Zeichen-Aktion mit
eingezogenem Stift erst einmal an eine absolute Position stellen und auf
einen bestimmten Winkel drehen. So kann man dann die Lage des Dreiecks
auf der Fläche bestimmen.

Was meinst du mit "eingezogenem Stift"?



Gruß
Benedikt Schwarz

Thomas Lenarz

unread,
Apr 10, 2013, 11:07:05 AM4/10/13
to pyth...@python.org
Am 09.04.2013 21:14, schrieb Reimar Bauer:
> Lass mal �berlegen, also wenn man es partout nicht ausrechnen will, dann
> kann man ja die Seiten A mit B und B mit C nicht starr verbinden.
> Dann fixiert man A und bewegt das Ende von C auf den Anfang von A.
> Das ergibt automatisch das durch die L�ngen vorgegebene Dreieck.
:-) Lustig, dass ein so trivial erscheinendes Problem sich doch nicht so
einfach erweist. Ich hatte auch �berlegt, wie ich den Fall mit den drei
vorgegebenen L�ngen ohne Computer angehen w�rde.

Ergebnis: Die erste Strecke A zeichnen. Dann mit einem Zirkel von den
beiden Endpunkten jeweils Kreise in der L�nge der beiden anderen
Strecken B und C zeichnen. Die beiden Schnittpunkte der Kreise ergeben
dann jeweils einen korrekten Kandidaten f�r den dritten Punkt.

Falls die Summe der beiden Strecken B und C zuf�llig gleich die L�nge
der Strecke A ergibt, gibt es den Sonderfall, dass nur ein Kandidat f�r
den dritten Punkt existiert. Und das Ergebnis ist ein ziemlich flaches
Dreieck.... ;-). Richtig gedacht?

Das Verfahren auf dem Computer zu simulieren stelle ich mir aber
aufwendig vor...

Viele Gr��e
Thomas

Hermann Riemann

unread,
Apr 10, 2013, 1:37:53 PM4/10/13
to
Thomas Lenarz schrieb:

> Ergebnis: Die erste Strecke A zeichnen. Dann mit einem Zirkel von den
> beiden Endpunkten jeweils Kreise in der Länge der beiden anderen
> Strecken B und C zeichnen. Die beiden Schnittpunkte der Kreise ergeben
> dann jeweils einen korrekten Kandidaten für den dritten Punkt.

> Das Verfahren auf dem Computer zu simulieren stelle ich mir aber
> aufwendig vor...

Strecke A habe die Endpunkte x0,y0 und x1,y1.
Dur rufst die Funktion
male Kreis_mit_farbe_ausgefuellt (x0,y0, laenge0, farbe0)
und
male Kreis_mit_farbe_ausgefuellt (x1,y1, laenge1, farbe1)
auf
und suchst kleine Rechtecke
die farbe0, farbe1 und Hintergrundfarbe enthalten.
Ist zwar rechnerisch aufwendiger, aber einfacher zu verstehen,
als wenn man mit ein paar geometrischer arithmestische Berechnungen
die 2 Punkte x2,y2 sucht.

Was dazu notwendig ist, sind Systeme
die sowohl Funktionen zum Kreise malen anbieten
(SDL (pygame) scheidet hier aus.)
als auch Pixel lesen können.
( *.svg scheidet hier aus.)
Ob es gtk bzw qt können, weiß ich nicht.

Hermann
der sich hier manchmal nach dem Atari ST
zurücksehnt, wo sowas einfach ging.

--
http://www.Hermann-Riemann.de
0 new messages