Programm: Dreieck Koordinaten berechnen |
24.04.2013, 00:30 | MathCoder | Auf diesen Beitrag antworten » | ||||
Programm: Dreieck Koordinaten berechnen Ich benötige für meine Programmierung einen Pfad über die Punkte eines Dreiecks. Zur Berechnung sind mir Punkt A, Punkt B und hc=30 (ist ein variabler Wert) bekannt. Ich benötige allerdings zur Vervollständigung meines Pfades den Punkt C. Wie komm ich an die Koordinaten und wie kann ich beide Lösungen in meinem Programm abfragen? Meine Ideen: Ich kann leider keine fixen Werte nennen, da der Pfad immer unterschiedlich verläuft. Ich hoffe ich rechne nicht zu kompliziert und es gibt vielleicht einen einfacheren Weg. Schritt 1: Länge c zwischen A(x1,y1) und B(x2,y2) c= wurzel ((x2-x1)^2+(y2-y1)^2) Schritt 2: Länge a und b (Punkt C ist immer genau auf halber Strecke von c mit der Entfernung von hc=30) a=b=wurzel(((c/2.0f)*(c/2.0f))-(30*30)) Schritt 3: Berechnung Winkel C w=arcsin ((y2-y1)/c) Schritt 4: Berechnung Winkel A alpha=arccos((b^2+c^2-a^2)/(2*b*c)) Schritt 5: Winkel zu Punkt C Lösung 1: delta1=w + alpha Lösung 2: delta2=w - alpha Schritt 6: A zu C Lösung 1: m1 = b * cos (delta1) Lösung 2: m2 = b * cos (delta2) Schritt 7: n berechnen Lösung 1: n1 = wurzel (b^2 - m1^1) Lösung 2: n2 = wurzel (b^2 - m2^2) Schritt 8: Punkt C Lösung 1: x3(1) = x1 + m1 y3(1) = y1 + n1 Lösung 2: x3(2) = x1 + m2 y3(2) = x1 - n2 Bei der Darstellung zeigt sich, dass Punkt C nicht wie gewollt 90° auf c liegt. Scheinbar dürfte es einen Fehler bei der Berechnung des Winkels geben oder überhaupt bei der Endberechnung von Punkt C. Ich hab mir die Formeln teilweise aus dem Internet zusammen gebastelt und bin mir auch nicht zu 100% sicher, ob der Rechenweg stimmt. |
||||||
24.04.2013, 09:16 | riwe | Auf diesen Beitrag antworten » | ||||
RE: Programm: Dreieck Koordinaten berechnen wenn nur A, B und h_c gegeben sind, ist das zu wenig. wenn schritt 2 stimmt, geht´s viel einfacher vektoriell, da brauchst du keine winkel zu berechnen. der schluß ist absoluter käse |
||||||
24.04.2013, 09:19 | Steffen Bühler | Auf diesen Beitrag antworten » | ||||
RE: Programm: Dreieck Koordinaten berechnen Ich hab mir Deinen Rechenweg jetzt nicht genau angeschaut, aber vielleicht ist es eleganter, wenn Du es über Vektorrechnung machst: der Vektor AB hat die Länge, die Du ja schon berechnet hast, und den Winkel Diese atan2-Funktion dürfte in Deiner Programmierumgebung zu finden sein, ist aber zur Not auch schnell geschrieben. Dann geht's nämlich ganz schnell: der Punkt, der in der Mitte der Strecke AB liegt, hat als Koordinaten den Mittelwert der Endpunktkoordinaten, also z.B. x=(x1+x2)/2. Du siehst, hier ist der Pythagoras gar nicht nötig, die Länge brauchst Du hier nicht. An diesem Punkt biegst Du ja dann um 90° ab und fährst 35 weiter. Das heißt, Du addierst 90° zum Winkel von AB, dann kannst Du über sin und cos die Koordinaten von C direkt berechnen. Wenn's Schwierigkeiten gibt, melde Dich einfach noch mal. Viele Grüße Steffen EDIT: etwas spät dran... |
||||||
25.04.2013, 00:40 | MathCoder | Auf diesen Beitrag antworten » | ||||
Danke für den Tipp! Ich hab die Berechnung mal eingebaut allerdings stimmt es nicht ganz :-( Hier sind die Rechengänge: float w=(atan2f((y2-y1),(x2-x1))); <-- Winkel in Grad w+=90.0; float p_ab_x=(x1+x2)/2.0; float p_ab_y=(y1+y2)/2.0; float p_c_x=p_ab_x+(cosf(w)*30.0); float p_c_y=p_ab_y+(30.0/sinf(w)); Wenn ich nun die Punkte darstellen lasse, sieht man, dass der Punkt C nicht zentral zwischen A und B liegt. Beispiels Resultat: P1: 248.00,218.00 P2: 336.00,130.00 P3: 307.76,209.26 <-- Punkt C ist nicht richtig berechnet?? |
||||||
25.04.2013, 00:46 | riwe | Auf diesen Beitrag antworten » | ||||
A und B |
||||||
25.04.2013, 09:20 | Steffen Bühler | Auf diesen Beitrag antworten » | ||||
Falls Du nicht ein exotisches atan2f() verwendest, das Gradmaß zurückgibt, darfst Du hier natürlich nicht 90.0 addieren, sondern 90°, also pi/2.
Und den versteh ich auch nicht. Warum teilst Du durch den Sinus und multiplizierst nicht, wie Du es ja korrekterweise mit dem Cosinus auch tust? Viele Grüße Steffen |
||||||
Anzeige | ||||||
|
||||||
25.04.2013, 09:58 | riwe | Auf diesen Beitrag antworten » | ||||
noch einmal: wozu die winkel (zu beachten wäre, dass es 2 lösungen gibt) |
||||||
26.04.2013, 18:43 | MathCoder | Auf diesen Beitrag antworten » | ||||
@riwe: Ich meinte mit "A" eig. P, "B" ist P2 und "C" ist P3. Den Winkel benötigt ich um mir vom Punkt AB, dieser Punkt liegt genau auf der halben Strecke von AB, die x und y Werte für Punkt C zu berechnen. @Steffen Bühler: atan2f() gibt mir den Winkel in Radiant, denn ich allerdings in Grad umrechne und anschließend mit +90.0 addiere. Ausgangsgleichung zur Berechnung von y: sin(alpha)=30.0/y dh folgt y=30.0/sin(alpha) Ausgangsgleichung zur Berechnung von x: cos(alpha)=x/30.0 dh folgt x=cos(alpha)*30.0 |
||||||
26.04.2013, 19:23 | riwe | Auf diesen Beitrag antworten » | ||||
na wenn du es halt immer noch besser weißt, sei dir dein (aber)glaube unbenommen |
||||||
26.04.2013, 22:03 | MathCoder | Auf diesen Beitrag antworten » | ||||
@riwe: Mein Beitrag war keines Wegs böse gemeint! Ich wollte nur sicherstellen, dass du meine Gedankengänge nachvollziehen kannst. Ich wüsste eben nicht, wie ich ohne Winkel und "nur" mit Punkt A,B und hc den Punkt C berechnen kann. Es muss doch möglich sein! Neben Info: Es handelt sich hierbei um ein gleichschenkeliges Dreieck -> Seite a und b sind gleich und können auch berechnet werden. Somit fehlen fast keine weiteren Angaben oder? Wenn es weitere Ideen/Tipps gibt - ich bin gerne offen für alles |
||||||
27.04.2013, 10:13 | riwe | Auf diesen Beitrag antworten » | ||||
wie du meinem 1. beitrag und obigem bilderl entnehmen kannst, habe ich verstanden, dass es sich um ein gleichschenkeliges 3eck handelt. daher braucht man sich auch nicht um die winkel zu bemühen. ich weiß ja, dass C senkrecht über/ unter dem mittelpunkt der strecke AB im abstand h liegt. daher genügen die obigen 3 zeilen, um die koordinaten von C VEKTORIELL zu bestimmen. die rechnung beschränkt sich damit auf addition, subtraktion, multiplikation und einmaliges wurzelziehen. damit du meinen gedankengang verstehst |
||||||
27.04.2013, 11:48 | MathCoder | Auf diesen Beitrag antworten » | ||||
@riwe: Danke für die Erklärung. Ich muss dazu sagen, dass das Rechnen mit Vektoren bei mir schon eine halbe Ewigkeit her ist. Daher hab ich mir mal die Grundlagen angesehen: Laut deiner Gleichung berechnet man Vektor c, in wiefern kann ich daraus den Punkt C berechnen? Um das Ganze zu verstehen schreib ich dir mal meine aufgefrischten Vektor Kenntnisse zusammen: AB Pfeil = Ortsvektor B minus Ortsvektor A = B(x)-A(x) und B(y)-A(y) OC Pfeil = Ortsvektor C, da Punkt C nicht bekannt ist kann ich den nicht berechnen Was bedeutet der Pfeil zwischen AB und OC? OA Pfeil= Ortsvektor A = Koordinaten A(x,y) 1/2 * Vektor c = 1/2 * Strecke c +- (h/Betrag Vektor c)*Vektor c?? Das "+-" steht wahrscheinlich für beide Lösungen. h ist klar und beträgt 30. Betrag Vektor c = wurzel (c1^2+c2^2) = wurzel ( (B(x)-A(x))^2 + (B(y)-A(y))^2 ) Wie rechnet man einen Wert durch Betrag Vektor c? Was bedeutet Vektor c (invertiertes T)? |
||||||
27.04.2013, 12:02 | riwe | Auf diesen Beitrag antworten » | ||||
ewig scheint wirklich ewig zu bedeuten bedeutet: mit der bezeichnung "vektor c" für den "vektor AB" (- wie im dreieck üblich -) FOLGT für den "ortsvektor von C" ..... und es gilt also genau das, was du suchst, und natürlich noch nicht bekannt also wirklich eine ewigkeit oder etwas mehr ist bekanntlich eine zahl <> 0, daher kann man auch durch sie dividieren, man nannt das, einen vektor NORMIEREN = auf die länge 1 stutzen. letzlich bedeutet den zu SENKRECHTEN vektor, den man in der ebene ja ganz einfach ohne rechnung kennt, wenn man kennt |
||||||
27.04.2013, 12:46 | MathCoder | Auf diesen Beitrag antworten » | ||||
@riwe: Danke für deine Geduld und ausführliche Erklärung! Ich werde mal die ganze Gleichung in mein Programm einbauen und dich am laufenden halten. |
||||||
27.04.2013, 12:53 | riwe | Auf diesen Beitrag antworten » | ||||
zur vorsicht: einen senkrechten vektor in der ebene bekommt man so - ohne rechnung: also durch vertauschen der komponenten, wobei EINE komponente das vorzeichen wechselt (das folgt aus dem skalarprodukt) |
||||||
27.04.2013, 13:04 | Steffen Bühler | Auf diesen Beitrag antworten » | ||||
Ich weiß, es ist nicht schön, wenn zwei Helfer gleichzeitig tätig sind, und ich finde riwes Methode auch eleganter. Ich bin halt mehr auf komplexe Zahlen aus. Trotzdem noch eine Anmerkung zur Klärung: Dass Dein atan2f()-Rückgabewert in Grad umgerechnet wird, sehe ich nirgends. Ist das also wirklich der Fall? Und akzeptieren dann konsequenterweise die sinf()- und cosf()-Funktion ebenfalls Gradmaß? Der Sinus stellt ja das Verhältnis Gegenkathete/Hypotenuse dar, und der Cosinus das Verhältnis Ankathete/Hypotenuse. Die Hypotenuse ist hier die 30 und steht jeweils im Nenner. Daher muss gelten: x=30*cos(alpha) y=30*sin(alpha) Wenn diese beiden Dinge geklärt sind, sollte auch meine Methode klappen. Viele Grüße Steffen |
||||||
27.04.2013, 17:31 | MathCoder | Auf diesen Beitrag antworten » | ||||
Finally it's done! @riwe: Mit der zusätzlichen Hilfestellung zum senkrechten Vektor hat es dann geklappt! @Steffen Bühler: Ein Dankeschön auch an dich, für deine Hilfe. Scheinbar dürfte sinf und cosf nur Radiant als Paramter akzeptieren. Somit sind beide Hilfestellungen richtig Danke nochmals euch beiden für die schnelle und ausführliche Hilfe! Wünsch euch noch ein schönes Wochenende |
|
Verwandte Themen
Die Beliebtesten » |
|
Die Größten » |
|
Die Neuesten » |
|