Programm: Dreieck Koordinaten berechnen

Neue Frage »

MathCoder Auf diesen Beitrag antworten »
Programm: Dreieck Koordinaten berechnen
Meine Frage:
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.
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
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...
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??
riwe Auf diesen Beitrag antworten »

Zitat:
Original von MathCoder
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??


A und B verwirrt verwirrt verwirrt
Steffen Bühler Auf diesen Beitrag antworten »

Zitat:
Original von MathCoder
float w=(atan2f((y2-y1),(x2-x1))); <-- Winkel in Grad
w+=90.0;


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.

Zitat:
Original von MathCoder
float p_c_x=p_ab_x+(cosf(w)*30.0);
float p_c_y=p_ab_y+(30.0/sinf(w));


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
 
 
riwe Auf diesen Beitrag antworten »

noch einmal: wozu die winkel verwirrt

(zu beachten wäre, dass es 2 lösungen gibt)
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
riwe Auf diesen Beitrag antworten »

na wenn du es halt immer noch besser weißt, sei dir dein (aber)glaube unbenommen unglücklich
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 smile
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 Augenzwinkern
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)?
riwe Auf diesen Beitrag antworten »

Zitat:
Original von riwe




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 unglücklich

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
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. smile
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)
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
MathCoder Auf diesen Beitrag antworten »

Finally it's done! Big Laugh

@riwe:
Mit der zusätzlichen Hilfestellung zum senkrechten Vektor hat es dann geklappt! smile

@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 smile

Danke nochmals euch beiden für die schnelle und ausführliche Hilfe!

Wünsch euch noch ein schönes Wochenende smile
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »