AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Vom Vektor zur Ebene

Ein Thema von juniorA · begonnen am 16. Jun 2013 · letzter Beitrag vom 25. Jun 2013
Antwort Antwort
Seite 3 von 3     123   
juniorA

Registriert seit: 14. Sep 2011
112 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#21

AW: Vom Vektor zur Ebene

  Alt 24. Jun 2013, 12:49
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;
Miniaturansicht angehängter Grafiken
3punkt.jpg  
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#22

AW: Vom Vektor zur Ebene

  Alt 24. Jun 2013, 13:38
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:
  E2.x := p.x + v1.x;
  E2.y := p.y + v1.y;
  E2.z := p.z + v1.z;
Demnach müsste die Berechnung mit dieser Notation also folgendermaßen sein:
Delphi-Quellcode:
v3 := v1 X v2
E3 := E2 + k*v3
oder im Code:
Delphi-Quellcode:
  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);
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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
juniorA

Registriert seit: 14. Sep 2011
112 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#23

AW: Vom Vektor zur Ebene

  Alt 24. Jun 2013, 15:44
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:
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)
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?

Beste Grüße
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#24

AW: Vom Vektor zur Ebene

  Alt 24. Jun 2013, 16:27
Das Kreuzprodukt multipliziert ja zwei Vektoren:

Delphi-Quellcode:
  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
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.

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).
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
juniorA

Registriert seit: 14. Sep 2011
112 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#25

AW: Vom Vektor zur Ebene

  Alt 24. Jun 2013, 17:01


gibt es nicht einen universellen Ansatz, so das man k bestimmen kann, das es immer passt?
Stehe gerade mächtig auf den Schlauch.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#26

AW: Vom Vektor zur Ebene

  Alt 24. Jun 2013, 17:12


gibt es nicht einen universellen Ansatz, so das man k bestimmen kann, das es immer passt?
Stehe gerade mächtig auf den Schlauch.
Was heißt denn "immer passt"?

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.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
juniorA

Registriert seit: 14. Sep 2011
112 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#27

AW: Vom Vektor zur Ebene

  Alt 25. Jun 2013, 08:12
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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:58 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz