Forum: PC-Programmierung Vektorrechnung, Fußpunkt berechnen, was ist d?


von Rotkev (Gast)


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.

von Rotkev (Gast)


Lesenswert?

Oder anders: Wie kommt der Typ bei http://sos-mathe.ch/pdfv/v35_4.pdf 
auf 35 für EABC?

von Karl H. (kbuchegg)


Lesenswert?

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.

von Rotkev (Gast)


Lesenswert?

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.

von Rotkev (Gast)


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));

von Rotkev (Gast)


Lesenswert?

Formel für das Lot ist

x0_vek = p_vek + (((d-(n_vek*p_vek))/n_vek*n_vek) * n_vek)

von Rotkev (Gast)


Lesenswert?

Formel für den Fußpunkt ist

x0_vek = p_vek + (((d-(n_vek*p_vek))/n_vek*n_vek) * n_vek)

von Karl H. (kbuchegg)


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 ) );

von dd (Gast)


Lesenswert?

d = Distanz (distance)

von Rotkev (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


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.

von Rotkev (Gast)


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

von Rotkev (Gast)


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)));
}

von Rotkev (Gast)


Lesenswert?

X_Achsen_Vektor = Punkt-auf-neuer-X-Achse minus NeuerKoordinatenursprung
Y_Achsen_Vektor = Punkt-auf-neuer-Y-Achse minus NeuerKoordinatenursprung

von Karl H. (kbuchegg)


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.

von Rotkev (Gast)


Lesenswert?

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.

von Udo S. (urschmitt)


Lesenswert?

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.

von Rotkev (Gast)


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.

von Karl H. (kbuchegg)


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.

von Udo S. (urschmitt)


Lesenswert?

Rotkev schrieb:
> Dann müßtest du ja ein Grünschnabel sein.

Ziemlich armseliger Return.
Aber Karl Heinz hat recht. Wir haben kein Problem :-)

von Rotkev (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.