Entwickler-Ecke
Sonstiges (Delphi) - Dreieck zeichnen
WormHole - Di 17.05.05 14:34
Titel: Dreieck zeichnen
Wie kann ich ein Dreieck auf Grund von Angaben zeichnen? Also Eingabe:
a = 3 cm
b = 4 cm
c = 5 cm
Dann soll der das Zeichnen... Danke für Antworten!
AXMD - Di 17.05.05 14:37
Gar nicht :roll: . Abgesehen davon, dass der PC nicht mit Zentimetern, sondern mit Pixel rechnet, wirst du noch das Problem haben, dass du ein Dreieck nicht einfach nur aus 3 Seitenlängen zeichnen kannst - du bräuchtest mindestens einen Winkel oder zumindest eine Routine, die die nötigen Koordinaten des Schnittpunktes von a und b berechnet (c ist malm als Grundlinie angenommen).
Tipp: TCanvas.LineTo
AXMD
WormHole - Di 17.05.05 14:56
Das Problem mit den cm habe ich schon gelöst ;)
Also brauch man wenigstens einen Winkel? Gut dann angenommen:
alpha = 60°
b = 5 cm
c = 6 cm
Wie kann ich denn mit lineto sagen das der in einem 60° Winkel zeichnen soll?
Gausi - Di 17.05.05 14:57
Ich denke schon, dass das möglich ist.
erster Schritt: Zeichne Linie a. z.B. von Pa=(0,0) nach Pb=(a,0)
Man benötigrt jetzt die Koordianten des dritten Punktes Pc=(Xc,Yc). Für die Punkte, die von (0,0) so weit entfernt sind, wie Linie b lang ist, gilt:
Xc^2+Yc^2=b^2
Außerdem gilt
((Xc-a)^2 + Yc^2 = c^2)
Aus der ersten Gleichung folgt:
Xc=sqrt(b^2-Yc^2) Das eingesetzt in die andere Gleichung ergibt
(((sqrt(b^2-Yc^2))-a)^2 + Yc^2 = c^2)
Wenn ich micht jetzt auf die Schnelle nicht verrechnet habe, erhält man für Yc:
Quelltext
1:
| Yc^2= b^2- [ (a^2+b^2-c^2) / (2a) ]^2 |
Damit hast du die Koordinaten des dritten Punktes. Wenn du das Dreieck an anderen Stellen zeichnen lassen willst, muss du es nur noch verschieben, indem du alle Punkte um den gleichen Wert änderst.
delfiphan - Di 17.05.05 16:06
WormHole hat folgendes geschrieben: |
Wie kann ich ein Dreieck auf Grund von Angaben zeichnen? Also Eingabe:
a = 3 cm
b = 4 cm
c = 5 cm
Dann soll der das Zeichnen... Danke für Antworten! |
Ein beliebiges Dreieck hat 6 Freiheitsgrade. Du brauchst also mindestens 6 Werte. (Beliebig bedeutet: Beliebige Ausrichtung und Position)
WormHole - Di 17.05.05 16:08
@ Gausi
Also ich muss sagen, dass ich das noch nicht richtig verstanden habe! Es wäre wirklich nett, wenn du mir das vielleicht noch einmal erklären könntest ;)
Ach und ich weiß nicht, ob ich das richtig verstanden habe, aber die Strecke von Punkt A nach Punkt B ist c. Die Strecke ist immer gegenüberliegend des Punktes!
@ Delphiphan
6 Werte? In der Schule kann man das auch mit nur 3 Werten machen. Seite, Winkel, Seite / Winkel, Seite, Winkel ... und so weiter! Warum brauch man denn 6 Werte?
delfiphan - Di 17.05.05 16:21
Wenn du folgende Aufgabe siehst
Zeichne ein Dreieck mit: a = 3 cm, b = 4 cm, c = 5 cm
dann nimmst du den Bleistift und fängst an irgendwo auf dem Blatt, ganz zufällig mal eine Seite zu zeichnen. Jeder eurer Klasse würde das Dreieck anders zeichnen: Andere Position auf dem Blatt, anderer Winkel, mal gespiegelt, mal auf dem Kopf, usw..
Der Computer braucht aber genaue Informationen WO das Dreieck gezeichnet werden soll, und WIE es ausgerichtet ist.
__b__
/| |\ | /
c/ |b b| \c a| /c
/____| |____\ |/
a a
Gausi - Di 17.05.05 16:27
Gut, ich bin dann evtl. auf die Schnelle etwas mit den Bezeichnungen durcheinandergekommen. Was ich meinte, wird hoffentlich an der Skizze im Anhang deutlicher. Trick ist es, mit Hilfe des Pytagoras die Gleichungen der beiden Kreise zu bestimmen, die man auch für das Zeichnen per Hand malen würde. Durch lösen des Gleichungssystem nach x und y erhält man den Schnittpunkt der beiden Kreise.
Man muss nur noch abfangen, dass der Schnittpunkt überhaupt existiert, und auch bdedenken, dass man sich für einen der Schnittpunkte entscheiden muss, wenn es zwei gibt.
delfiphan - Di 17.05.05 16:32
//Edit: Diesen Post könnt ihr eigenetlich löschen. Sorry für die Umstände. Die 3 Posts nach diesem beziehen sich ohnehin nicht auf diesen.
F34r0fTh3D4rk - Di 17.05.05 16:39
wenn alle drei seiten bekannt sind, braucht man doch keinen winkel, aber eine koordinate wäre ganz hilfreich, ändert aber am dreieck nichst, und der winkel ist dann halt nur in welche richtung das dreieck gedreht ist :?
rjan - Di 17.05.05 16:39
@delfiephan (oder so) Wat wilste mit freiheitsgraden ...
BEI DREIECKEN BEI DENEN DREI INFORMTIONEN GEGEBEN SIND , IST EIN DREIECK (BIS AUF ZWEI DREI FÄLLE) KLAR DEFFINIERT :::> DAS LERNT MAN IN DER 9 ten klass...
als lösung gibt es die möglihkeit über sinus cosinus und tangenz dies zu lösen....
F34r0fTh3D4rk - Di 17.05.05 16:39
sag ich doch :D, das war wieder sonn sekunden ding, als meiner fertig war, stand deiner auch schon da :wink:
delfiphan - Di 17.05.05 16:48
Hoppla, das ging anfänglich an den falschen Ort. Also hier nochmals:
x^2+y^2 = a^2
(x-c)^2+y^2 = b^2
Die Skizze dazu:
x,y
/ \
a/ \b
/_________\
0,0 c,0
Die Lösung:
x = 1/2*(c^2+a^2-b^2)/c
y = 1/2*sqrt((a+b+c)*(b+c-a)*(a+b-c)*(a+c-b))/c (2. Lösung wäre einfach gespiegelt)
Dabei muss gelten:
a+b>=c,
a+c>=b,
b+c>=a, damit es eine reelle Lösung gibt.
Somit zeichnest du das Polygon
(0,0),(0,c),(x,y) und alle hier sind glücklich. Jedoch ist das halt nicht die einzige Lösung, sondern einfach eine. Es gibt unendlich viele Lösungen.
Aber schaut mal hier nach:
http://de.wikipedia.org/wiki/Dreieck da gibts viele, viele Sätze, einige helfen bestimmt weiter.
rjan: Fast, *hust*, "delfiphan", heisst es korrekt. Nun zu deiner Bemerkung: Worüber regst du dich überhaupt auf? Du hast mich wohl falsch verstanden. Ich hab doch sogar ASCII-Zeichnungen gemacht zur Illustration, dass es nicht eindeutig ist. Ich spreche von Dreiecken, du sprichst von kongruenten Dreiecken; aber das bringt dem PC herzlich wenig, denn da sind konkrete Koordinaten gefragt, und die sind nun mal nicht eindeutig, wenn nur 3 Zahlen gegeben sind.
Es sind i.A. 6 Zahlen nötig, damit ein Dreieck eindeutig ist (z.B. 3x2D-Koordinaten; oder a+b+c+Koordinaten des Schwerpunktes+Winkel; oder, wer's mathematisch mag: Einheitsdreieck+affine Transformation=beliebiges Dreieck. Affine Transformation = 2x2-Matrix+Translationsvektor. Dabei hat diese 2x2 Matrix i.A. vollen Rang, ist also nicht singulär => 4+2=6)
rjan - Di 17.05.05 18:39
ok kappiert .... ascii zeichnungen sind nicht mein lieblings bereich
WormHole - Di 17.05.05 20:32
Ich muss mal sagen hier wurde ja einiges am Thema vorbei geredet! Dank Delfiphan habe ich nun doch die Formel... wenn ich mich nicht täusche...
| Delfiphan hat folgendes geschrieben: |
Hoppla, das ging anfänglich an den falschen Ort. Also hier nochmals:
x^2+y^2 = a^2
(x-c)^2+y^2 = b^2
Die Lösung:
x = 1/2*(c^2+a^2-b^2)/c
y = 1/2*sqrt((a+b+c)*(b+c-a)*(a+b-c)*(a+c-b))/c (2. Lösung wäre einfach gespiegelt) |
Was ist denn sqrt? Dann hab ichs langsam ;) Oder am besten noch mit Beispiel mal machen ^^
greetz WormHole
delfiphan - Di 17.05.05 20:48
sqrt ist die Quadratwurzel. Und
sqr bedeutet "im Quadrat".
Beispiel:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| var a, b, c, x, y: Extended; begin c := 100; a := 80; b := 90; x := 1/2*(sqr(c)+sqr(a)-sqr(b))/c; y := 1/2*sqrt((a+b+c)*(b+c-a)*(a+b-c)*(a+c-b))/c; Image1.Canvas.Polygon([Point(0,0),Point(Round(c),0), Point(Round(x),Round(y))]); end; |
WormHole - Di 17.05.05 21:24
@ Delfiphan
Du bist mein persönlicher Held des Tages.... Dank an dich!
@ Rest
Danke an euch alle... Ohne euch.... wär ich nicht weiter gekommen ;)
THX FRAGE BEANTWORTET!
WormHole - Mi 18.05.05 20:51
So, soll ich das Topic mal eben wechseln??? Neue Frage zum (fast) selben Thema.
Nun wollte ich ein Parallelogramm auf die selbe Weise machen. Dazu habe ich es wie folgt gemacht:
Quelltext
1: 2: 3:
| x := 1/2*(sqr(c)+sqr(a)-sqr(b))/c; y := 1/2*sqrt((a+b+c)*(b+c-a)*(a+b-c)*(a+c-b))/c; Paintbox1.Canvas.Polygon([Point(100,150),Point(Round(a*cm),0), Point(Round(x*cm),Round(y*cm), Point(Round(x*cm+a),Round(y*cm)))]); //hier wollte ich noch einen Point dazu machen(Paralellogramm) |
Too many actual parameters... Was das heißt weiß ich wohl! Das diese Methode nur für Drei Punkte zu gebrauchen ist. Nur wie kann ich das selbe mit 4 Punkten machen?
Gosa - Mi 18.05.05 21:06
Musst do wohl 4 Linien einzelnd zeichnen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| Procedure LinieVonBis(P1,P2 :TPoint); Begin With Paintbox1.Canvas do Begin MoveTo(P1.X , P1.Y); LineTo(P2.X , P2.Y); End; End; |
WormHole - Mi 18.05.05 21:22
Gosa hat folgendes geschrieben: |
| Musst do wohl 4 Linien einzelnd zeichnen |
Hatte ich mir schon fast gedacht! ;)
Das ist nun auch geschafft....
greetz WormHole
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!