![]() |
AW: Vom Vektor zur Ebene
Liste der Anhänge anzeigen (Anzahl: 1)
Leider noch nicht am Ziel
Habe es eben mit den Vorschlag E3 := (V2-V1) x (P-V1) + V1 siehe Quelltext versucht aber da kommt nicht das gewünschte Ergebnis raus. In meinem Beispiel hat P als Ausgangspunkt und ein Punkt der Dreiecksfläche E1 die Koordinaten (10, 0, 5) im Weltkoordinatensystem. Auf den 2. Punkt der Dreiecksfläche E2, steht eine Senkrechte. Der Anfangspunt der Senkrechten hat eine Differenz zu P von (-5, 0,-5). Es ergeben sich damit die Weltkoordinaten für E2 von (5, 0, 0). Der Endpunkt der Senkrechten V2 hat zum Anfangspunkt der Senkrechten V1 eine Differenz von (-5, 0, 5). Für den Punkt E3 gilt: Der Abstand zu V1 = Abstand von V1 zu P = Abstand von V1 zu V2. Weiter ist der Winkel P/V1/E3, P/V1/V2 und V2/V1/E3 0 90°. Wie kann ich mir nun E3 ausrechnen, wenn P, V1 und V2 gegeben sind? Das Ergebnis ist im Beispiel (5, 5, 0) aber wie kann ich mir dieses ausrechnen? Habe dazu auch noch einmal eine Skizze gemacht.
Delphi-Quellcode:
type Tpoint3D = record X : single; Y : single; Z : single; end; //------------------------------------------------------------------------------ // Bestimmen des 3. Punktes einer Fläche //------------------------------------------------------------------------------ procedure fl_3Punkte(p, v1, v2 : TPoint3D; var E1, E2, E3 : TPoint3D); var d1, d2, kp : TPoint3D; begin E1 := P; E2.x := p.x + v1.x; E2.y := p.y + v1.y; E2.z := p.z + v1.z; // EP3 = (V2-V1) x (P-V1) + V1 ???? d1.x := v2.x - v1.x; d1.y := v2.y - v1.y; d1.z := v2.z - v1.z; d2.x := p.x - v1.x; d2.y := p.y - v1.y; d2.z := p.z - v1.z; kp.x := (d1.y*d2.z) - (d2.y*d1.z); kp.y := (d1.z*d2.x) - (d2.z*d1.x); kp.z := (d1.x*d2.y) - (d2.x*d1.y); E3.x:= kp.x + v1.x; E3.y:= kp.y + v1.y; E3.z:= kp.z + v1.z; end; |
AW: Vom Vektor zur Ebene
Deine Bezeichnungen von V1 und V2 passen in der Zeichnung nicht zu den Werten. V1 und V2 sind offensichtlich als Differenzvektoren angegeben. Insofern ist die Angabe V1 = E2 schon mal falsch, was du ja auch in deinem Code eindrucksvoll belegst:
Delphi-Quellcode:
Demnach müsste die Berechnung mit dieser Notation also folgendermaßen sein:
E2.x := p.x + v1.x;
E2.y := p.y + v1.y; E2.z := p.z + v1.z;
Delphi-Quellcode:
oder im Code:
v3 := v1 X v2
E3 := E2 + k*v3
Delphi-Quellcode:
Der Faktor k muss dann eben so gewählt werden, daß die Abstandsbedingung eingehalten wird - sollte nicht so schwer sein. Du kanns k auch negativ machen, um die zweite mögliche Lösung zu bekommen, die nach den gegebenen Bedingungen möglich ist.
v3.x := (v1.y*v2.z) - (v2.y*v1.z);
v3.y := (v1.z*v2.x) - (v2.z*v1.x); v3.z := (v1.x*v2.y) - (v2.x*v1.y); |
AW: Vom Vektor zur Ebene
dem Ziel schon ganz nahe,
also erst einmal Danke. Mit der Berechnung von E2 hattest Du Recht, V1 ist ja Differenz und P fehlte. der Quelltext sieht jetzt wie folgt aus
Delphi-Quellcode:
wenn ich als Faktor k=1 angegeben habe, hatte ich erwartet, dass E3.y = 5 und nicht 50 ist. Mit k = 0.1 erscheint dort 5. Was hat es mit den Faktor auf sich oder ist noch wo anders etwas vergraben?
type Tpoint3D = record
X : single; Y : single; Z : single; end; //------------------------------------------------------------------------------ // Bestimmen des 3. Punktes einer Fläche //------------------------------------------------------------------------------ procedure fl_3Punkte(p, v1, v2 : TPoint3D; var E1, E2, E3 : TPoint3D); var v3 : TPoint3D; k : single; begin k := 1; E1 := P; E2.x := p.x + v1.x; E2.y := p.y + v1.y; E2.z := p.z + v1.z; v3.x := (v1.y*v2.z) - (v2.y*v1.z); v3.y := (v1.z*v2.x) - (v2.z*v1.x); v3.z := (v1.x*v2.y) - (v2.x*v1.y); E3.x := E2.x + k*v3.x; E3.y := E2.y + k*v3.y; E3.z := E2.z + k*v3.z; end; function set_point3(x, y, z : single) : TPoint3D; begin result.x := x; result.y := y; result.z := z; end; ..... Aufruf fl_3Punkte fl_3Punkte(set_point3(10, 0,5), set_point3(-5, 0, -5), set_Point3(-5, 0, 5), E1, E2, E3); Als Ergebnis bekomme ich E1 = (10,0,5) E2 = (5,0,0) E3 = (5, [COLOR="Red"]50[/COLOR], 0) Beste Grüße |
AW: Vom Vektor zur Ebene
Das Kreuzprodukt multipliziert ja zwei Vektoren:
Delphi-Quellcode:
Da v1 und v2 senkrecht aufeinander stehen, ist |v3| = |v1|*|v2|, also dem Produkt der Längen der beiden Vektoren. Da beide Längen aber gleich sind, musst du k := 1/|v1| = 1/sqrt(50) setzen, damit v3 die gleiche Länge bekommt, wie die beiden andere v-Vektoren. Da v3 nur einen y-Anteil hat (v1 und v2 haben jeweils nur x/z-Anteile, spannen daher also eine Ebene in x/z auf), errechnet sich der zu ca. 7.
v1 = (-5, 0,-5)
v2 = (-5, 0, 5) v3.x := (v1.y*v2.z) - (v2.y*v1.z); => 0*5 - 0*-5 = 0 v3.y := (v1.z*v2.x) - (v2.z*v1.x); => -5*-5 - 5*-5 = 50 v3.z := (v1.x*v2.y) - (v2.x*v1.y); => -5*0 - -5*0 = 0 Dabei ist anzumerken, daß deine Lösung für E3 = (5, 5, 0) einen Abstand zu E2 = (5, 0, 0) von Sqrt((5-5)² + (5-0)² + (0-0)²) = Sqrt(25) hat, während der Abstand zwischen E1 = (10, 0, 5) und E2 mit Sqrt((10-5)² + (0-0)² + (5-0)²) = Sqrt(50) ist, was deiner Abstandsbedingung widerspricht. Der korrekte Wert für E3 wäre demnach (5, Sqrt(50), 0). |
AW: Vom Vektor zur Ebene
:oops:
gibt es nicht einen universellen Ansatz, so das man k bestimmen kann, das es immer passt? Stehe gerade mächtig auf den Schlauch. |
AW: Vom Vektor zur Ebene
Zitat:
Auch wenn v1 und v2 nicht gleich lang sind, kannst du immer k := 1/|v2| rechnen. Grundlage dafür ist die Gleichheit der Abstände zwischen E1/E2 und E2/E3. Damit lässt sich leider kein E3(5,5,0) heraus bekommen, da dieses von der Länge her nicht passt. Dein E3 liegt zwar in der Ebene, hat aber zu E2 den falschen Abstand. Wenn E3(5,5,0) wirklich die gewünschte Lösung ist, dann stimmen deine Bedingungen nicht. |
AW: Vom Vektor zur Ebene
Uwe hat Recht.
Hatte einen Denkfehler denn wenn die Länge von E2 zu E3 die gleiche wie von E1 zu E2 sein soll und das ganze einen rechten Winkel hat, kann da nur Wurzel aus 50 rauskommen, denn dafür gibt es den Pytagoras. Groschen ist gefallen. Also noch einmal Danke für die Ausdauer. :) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz