Vektorrechnung, Fußpunkt berechnen, was ist d?

Gast #2560387
Lesenswert?

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.
Gast #2560468
Lesenswert?

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));
#2560699
Lesenswert?

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 ) );
#2561656
Lesenswert?

Ü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.
Gast #2561702
Lesenswert?

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
Gast #2561704
Lesenswert?

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)));
}
#2561789
Lesenswert?

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.
Gast #2562526
Lesenswert?

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.
#2562864
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren