Ich habe zwei Vektoren, die eine Ebene aufspannen. Ich möchte von einem Punkt P ein Lot darauf fällen und den Fußpunkt ermitteln. Hier findet sich der Thread mit formatierten Zeichen. http://math.stackexchange.com/questions/111702/how-to-extract-d-from-a-plane-being-created-by-two-vectors Mir ist unklar, was d ist. Bitte hier und auf Deutsch antworten.
Indem er einen der bekannten Punkte in die Ebenengleichung ax + by + cz + d = 0 eingesetzt und nach d aufgelöst hat. d ist geometrisch gesehen der Normalabstand der Ebene zum Ursprung es Koordinatensystems.
Karl Heinz Buchegger schrieb: > Indem er einen der bekannten Punkte in die Ebenengleichung > > ax + by + cz + d = 0 > > eingesetzt und nach d aufgelöst hat. > > > d ist geometrisch gesehen der Normalabstand der Ebene zum Ursprung es > Koordinatensystems. Stimmt, jetzt funktioniert es. Dank dir.
Es soll durch eine verschobene X und Y-Achse eine Fläche aufgespannt werden, auf die vom Punkt kopf ein Lot auf die Ebene gefällt wird, das im Punkt Fußpunkt mündet. Ergibt das folgende Sinn: n = kreuzprodukt(X_Achsen_Vektor,Y_Achsen_Vektor); n.X = n.X / (float)Math.Sqrt(zumQuadrat(n.X) + zumQuadrat(n.Y) + zumQuadrat(n.Z)); n.Y = n.Y / (float)Math.Sqrt(zumQuadrat(n.X) + zumQuadrat(n.Y) + zumQuadrat(n.Z)); n.Z = n.Z / (float)Math.Sqrt(zumQuadrat(n.X) + zumQuadrat(n.Y) + zumQuadrat(n.Z)); d = -((n.X * X_Achsen_Punkt.X) + (n.Y * X_Achsen_Punkt.Y) + (n.Z * X_Achsen_Punkt.Z)); Fußpunkt.X = (float)(kopf.X + (((d - (n.X * kopf.X)) / n.X * n.X) * n.X)); Fußpunkt.Y = (float)(kopf.Y + (((d - (n.Y * kopf.Y)) / n.Y * n.Y) * n.Y)); Fußpunkt.Z = (float)(kopf.Z + (((d - (n.Z * kopf.Z)) / n.Z * n.Z) * n.Z));
Formel für das Lot ist x0_vek = p_vek + (((d-(n_vek*p_vek))/n_vek*n_vek) * n_vek)
Formel für den Fußpunkt ist x0_vek = p_vek + (((d-(n_vek*p_vek))/n_vek*n_vek) * n_vek)
Rotkev schrieb: > Ergibt das folgende Sinn: Schreib dir doch erst mal ein paar Vektor Funktionen anstatt hier alles aufzudröseln. Das ist doch ausser fehleranfällig nur noch fehleranfällig. So wie du eine Funktion "kreuzprodukt hast" brauchst du eine Funktion "normalisiere" und eine Funktion "skalarprodukt" Dann beginnt dein Code so n = kreuzprodukt( X_Achsen_Vektor ,Y_Achsen_Vektor ); normalisiere( &n ); d = - skalarprodukt( n, X_Achsen_Punkt ); und das ist dann schon mal wesentlich besser zu verstehen als dein X/Y/Z Origien. Und wenn du dann noch ein bischen darauf achtest, wie sich ein Quadrat unter einem Bruchstrich übersetzt, dann könnte das sogar etwas werden. t0 aus dem ersten Link brauchst du nur einmal berechnen. Es ist für alle 3 Koordinatenachsen gleich. Also rechne dir das aus, setz in die Geradengleichung ein und du hast deinen Schnittpunkt. Aber was rechnest du da eigentlich rum? Du hast einen Punkt, du hast die Flächengleichung. Damit ergibt sich die Distanz des Punktes 'kopf' zu der Ebene als dist = skalarprodukt( n, kopf ) + d; um diese Distanz gehst du vom Punkt aus in Richtung des negativen Normalvektors und kriegst so den Punkt, an dem der Lotvektor auf die Ebene die Ebene durchstösst. fuss = add( kopf, scale( n, -dist ) );
sehe gerade, dort wird für t0 ein vektor durch einen vektor geteilt. Das ist aber nicht definiert. Was nun? Formel ist aus dem Stöcker Taschenbuch.
Überlegen, was eigentlich das t0 in p = p0 + t0 * delta überhaupt ist. Das t0 ist für alle Dimensionen des Vektors identisch. Du musst beim berechnenn nur aufpassen, dass du nicht durch 0 dividierst. Normalerweise nimmt man vom Vektor einfach die Komponente deren Absolutbetrag am größten ist. Aber: eigentlich brauchst du das gar nicht ausrechnen :-) Zumindest nicht so, wie in dem Link angegeben. Das führt nur zu 'massenhaft' Berechnungen, die gar nicht notwendig sind. Das hier dist = skalarprodukt( n, kopf ) + d; ist nämlich genau dieses t0, wenn n ein normierter Vektor ist, was er ja ist.
Ich habe jetzt folgendes: public SkeletonPoint FußkopfF(SkeletonPoint X_Achsen_Vektor, SkeletonPoint Y_Achsen_Vektor, SkeletonPoint kopf) { d = (float)(((X_Achsen_Vektor.X * kopf.X) + (X_Achsen_Vektor.Y * kopf.Y) + (X_Achsen_Vektor.Z * kopf.Z)) / Math.Sqrt(zumQuadrat(X_Achsen_Vektor.X) + zumQuadrat(X_Achsen_Vektor.Y) + zumQuadrat(X_Achsen_Vektor.Z))); return skalarprodukt(d,normalisieren(kreuzprodukt(X_Achsen_Vektor, Y_Achsen_Vektor))); } stimmt das so, wenn nicht, bitte modifizieren
Korrigiert public SkeletonPoint FußpunktF(SkeletonPoint X_Achsen_Vektor, SkeletonPoint Y_Achsen_Vektor, SkeletonPoint kopf) { d = (float)(((X_Achsen_Vektor.X * kopf.X) + (X_Achsen_Vektor.Y * kopf.Y) + (X_Achsen_Vektor.Z * kopf.Z)) / Math.Sqrt(zumQuadrat(X_Achsen_Vektor.X) + zumQuadrat(X_Achsen_Vektor.Y) + zumQuadrat(X_Achsen_Vektor.Z))); return skalarprodukt(d,normalisieren(kreuzprodukt(X_Achsen_Vektor, Y_Achsen_Vektor))); }
X_Achsen_Vektor = Punkt-auf-neuer-X-Achse minus NeuerKoordinatenursprung Y_Achsen_Vektor = Punkt-auf-neuer-Y-Achse minus NeuerKoordinatenursprung
Rotkev schrieb: > > stimmt das so, wenn nicht, bitte modifizieren erfinde ein paar Werte, stell vorab fest was rauskommen muss und dann lass deinen Code laufen und vergleich mit dem was rauskommen muss. Sorry. Aber nur so läuft die Sache. (Und ausserdem ist es ein gutes Training, ob du verstanden hast * worum es überhaupt geht * wie die Mathe dahinter funktioniert ) Wenn du 3 Punkte hast, die die Ebene aufspannen [0, 0, 0] (gemeinsam) [5, 0, 0] und [ 0, 5, 0 ] und einen Kopfpunkt von [8, 2, 7] dann liegt der Fusspunkt bei [8, 2, 0] Dann drehst du deine Vektoren mal (zb um die Z-Achse). Muss immer noch der gleiche Fusspunkt rauskommen. Dann verschiebst du die Punktkoordinaten mal. Zb in Z-Richtung. Zb. in X-Richtung. Dann drehst du die Vektoren mal um 90 um die Y-Achse. Wo muss dann der Fusspunkt sein. usw. usw. Am Anfang nimmt man Werte, bei denen man sich nur eine Skizze ansehen muss um zu entscheiden, welches das korrekte Ergebnis ist.
Karl Heinz Buchegger schrieb: > (Und ausserdem ist es ein gutes Training, ob du verstanden hast > * worum es überhaupt geht > * wie die Mathe dahinter funktioniert > ) Und außerdem suche ich mir Trainer selbst aus, und du bist nicht mein Trainer.
Rotkev schrieb: > Und außerdem suche ich mir Trainer selbst aus, und du bist nicht mein > Trainer. Na prima, da gibt sich Karl Heinz die größte Mühe und so ein unfähiger merkbefreiter Grünschnabel, der meint lernen besteht aus guttenbergen, wird auch noch frech! Da könnte man glatt seine Manieren vergessen.
Udo Schmitt schrieb: > Rotkev schrieb: >> Und außerdem suche ich mir Trainer selbst aus, und du bist nicht mein >> Trainer. > > Na prima, da gibt sich Karl Heinz die größte Mühe und so ein unfähiger > merkbefreiter Grünschnabel, der meint lernen besteht aus guttenbergen, > wird auch noch frech! > Da könnte man glatt seine Manieren vergessen. Dann müßtest du ja ein Grünschnabel sein.
Rotkev schrieb: > Karl Heinz Buchegger schrieb: >> (Und ausserdem ist es ein gutes Training, ob du verstanden hast >> * worum es überhaupt geht >> * wie die Mathe dahinter funktioniert >> ) > > Und außerdem suche ich mir Trainer selbst aus, und du bist nicht mein > Trainer. Dann frag ich mich, wozu du hier überhaupt nachfragst, wenn du sowieso keine Hilfe zur Selbsthilfe annehmen willst. Wenn ich mir deinen Code so ansehe, dann könntest du einen Trainer, der dich mal etwas härter rannimmt, extrem gut gebrauchen. Ach weißt du was. Mach doch deinen Kram alleine. Auf arrogante Schnösel ohne Manieren, die auf ihr Nichtwissen auch noch stolz sind, kann ich gerne verzichten.
Rotkev schrieb: > Dann müßtest du ja ein Grünschnabel sein. Ziemlich armseliger Return. Aber Karl Heinz hat recht. Wir haben kein Problem :-)
Udo Schmitt schrieb: > Rotkev schrieb: >> Dann müßtest du ja ein Grünschnabel sein. > > Ziemlich armseliger Return. > Aber Karl Heinz hat recht. Wir haben kein Problem :-) Hier ist nichts armselig außer deinen Kommentaren. Sprich nur weiter, wir schauen dir gerne zu.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.