Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Sa Mai 18, 2024 05:16

Foren-Übersicht » Programmierung » Mathematik-Forum
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Punkt im Dreieck?
BeitragVerfasst: Sa Apr 11, 2009 18:56 
Offline
DGL Member

Registriert: Sa Aug 09, 2008 09:07
Beiträge: 112
Hallo,

Ich versuche zur Zeit einen Raytracer zu programmieren. Mir hat sich dann folgendes Problem gestellt:
Wie finde ich heraus ob die Gerade das Dreieck schneidet?
Wie bekomme ich den Schnittpunkt?

Ich bin das Problem dann so angegangen:
1. Zuerst den Schnittpunkt der Gerade und der Dreiecksebene finden.
2. Dann prüfen ob sich der Punkt im Dreieck befindet.


-> 1. hab ich jetzt einmal so gelöst:

Gerade in Parameterform:
Code:
  1. (x, y, z) = 0A + f * AB
  2.  
  3. (x, y, z) ... Ortsvektor der einen Punkt auf der Geraden beschreibt
  4. 0A ... Ortsvektor des Anfangspunktes der Geraden
  5. f ... unbekannter Faktor
  6. AB ... Vektor der die Richtung der Geraden angibt


Ebene in Normalvektorform:
Code:
  1. n * 0E = n * (x, y, z)
  2.  
  3. n ... Normalvektor
  4. 0E ... Ortsvektor des "Anfangspunktes" der Ebene
  5. (x, y, z) ... Ortsvektor der einen Punkt auf der Ebene beschreibt


Dann hab ich die 1. Gleichung einfach in die 2. eingesetzt.
Das Ergebnis ist:

Code:
  1.  Zähler        n * OE - n * OA
  2. ---------- = -------------------- = f
  3.  Nenner             n * AB
  4.  
  5. Nenner = 0                  : Schneidet sich im Unendlichen, kein Schnittpunkt
  6. Nenner, Zähler = 0       : laut Newton ist 0/0 eine belibige Zahl, er hatte also Recht :) , Unendlichviele Schnittpunkte
  7.  
  8. f < 0     : Gerade und Ebene treffen sich "hinter" dem Punkt A, -> Der Strahl ist nur eine Halbgerade, Berechnung wird also
  9. abgebrochen



-> 2. dafür hab ich jetzt zwei Ansätze:

1)
Ich verwende die Formel die mir Coolcat gezeigt hat:
Code:
  1. (x, y, z) = OA + u * AB + v * AC
  2.  
  3. OA ... Ortsvektor auf den Punkt A
  4. u ... unbekannter Faktor
  5. AB ... Vektor zwischen dem Punkt A und B
  6. v ... unbekannter Faktor
  7. AC ... Vektor zwischen dem Punkt A und C
  8.  
  9. Wobei gilt:
  10. u, v >= 0
  11. u + v <= 1


Dann müsste ich nur noch den Schnittpunkt der Ebene und der Gerade einsetzten und das LGS lösen.
Leider muss ich da den Vektor zerlegen und das gefällt mir nicht so ganz...

2)
Ich rechne die Einheitsvektoren von AB und AC aus (ich bezeichne diese einmal mit a und b).
(x, y, z) bezeichne ich jetzt mit 0P.
Dann rechne ich den Vektor AP aus.

Und es ergibt sich folgendes:
Code:
  1. u = (a * AP) / |AB|
  2. v = (b * AP) / |AC|
  3.  
  4. u ... s.o.
  5. |AB| ... Betrag von AB
  6. v ... s.o.
  7. |AC| ... Betrag von AC


Nur noch die Bedingungen prüfen (s.o.) und weiß schon ob der Punkt auf dem Dreieck liegt.


Stimmt das alles so?
Bzw. was denkt ihr wäre effizienter ( 1) oder 2) )?


Danke im Voraus!
Andreas


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Apr 11, 2009 22:18 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Mir fällt da gerade ein ich hatte mal ne Mathe-Unit geschrieben....die Unit stammt zwar aus meinen DirectX-Zeiten...aber das sollte ja nicht das Problem sein.
=> http://www.delphidev.de/forum/viewtopic.php?id=69

Code:
  1. // =============================================================================
  2. // RayIntersectTriangle
  3. // =============================================================================
  4. // Testet eine Gerade mit einem Dreieck
  5. // Gibt exakte Koordinaten des Schnittpunktes zurück, diese müssen jedoch
  6. // umgewandelt werden:
  7. // D3DXVec3BaryCentric( Schnittpunkt, v0, v1, v2, u, v );
  8. // Das Funktioniert auch wenn man dort statt v0, v1 und v2 die Texturkoords der
  9. // entsprechenden Vertices übergibt.
  10. // Will man einfach nur den Schnittpunkt, ginge auch
  11. // Schnittpunkt := Origin + t * Dir;
  12. // (Funktion aus DirectX-SDK übersetzt in Delphi)
  13. function RayIntersectTriangle(const Origin, Dir, v0, v1, v2: TD3DXVector3;
  14.                                var t, u, v: Single ): Boolean;
  15. var edge1, edge2,
  16.     pvec, qvec, tvec: TD3DXVector3;
  17.     det, InvDet: single;
  18. begin
  19.   D3DXVec3Subtract( edge1, v1, v0 );
  20.   D3DXVec3Subtract( edge2, v2, v0 );
  21.  
  22.   D3DXVec3Cross( pvec, Dir, edge2 );
  23.  
  24.   det := D3DXVec3Dot( edge1, pvec );
  25.   if (det > 0) then begin
  26.     D3DXVec3Subtract( tvec, Origin, v0 );
  27.   end
  28.   else begin
  29.     D3DXVec3Subtract( tvec, v0, Origin );
  30.     det := -det;
  31.   end;
  32.  
  33.   if (det < 0.0001) then begin
  34.     result := false;
  35.     exit;
  36.   end;
  37.  
  38.   u := D3DXVec3Dot( tvec, pvec );
  39.   if ((u < 0) or (u > det)) then begin
  40.     result := false;
  41.     exit;
  42.   end;
  43.  
  44.   D3DXVec3Cross( qvec, tvec, edge1 );
  45.  
  46.   v := D3DXVec3Dot( Dir, qvec );
  47.   if ((v < 0) or ((u + v) > det)) then begin
  48.     result := false;
  49.     exit;
  50.   end;
  51.  
  52.   t := D3DXVec3Dot( edge2, qvec );
  53.   InvDet := 1 / det;
  54.   t := t * InvDet;
  55.   u := u * InvDet;
  56.   v := v * InvDet;
  57.  
  58.   result := true;
  59. end;

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Apr 12, 2009 17:28 
Offline
DGL Member

Registriert: Sa Aug 09, 2008 09:07
Beiträge: 112
Danke. Nur kann ich leider kein Delphi^^

Ich mach mit den oben geposteten Formeln einmal ein paar Test, um zu sehen ob sie stimmen...


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 13, 2009 10:50 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Apr 25, 2005 17:51
Beiträge: 464
Da benutz ich folgendes: http://www.cs.virginia.edu/~gfx/Courses/2003/ImageSynthesis/papers/Acceleration/Fast%20MinimumStorage%20RayTriangle%20Intersection.pdf

Ist einer der effektivsten Algorithmen, was das angeht.

edit: wenn ich den Delphi-Code da überfliege, scheint das genau die Methode aus der pdf zu sein

_________________
__________
"C++ is the best language for garbage collection principally because it creates less garbage." Bjarne Stroustrup


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Apr 13, 2009 12:00 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Danke. Nur kann ich leider kein Delphi^^

Dann schau ins DirectX SDK, wie im Kommentar zu lesen ist kommt die Methode nämlich daher...

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Foren-Übersicht » Programmierung » Mathematik-Forum


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 4 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen.
Du darfst keine Antworten zu Themen in diesem Forum erstellen.
Du darfst deine Beiträge in diesem Forum nicht ändern.
Du darfst deine Beiträge in diesem Forum nicht löschen.
Du darfst keine Dateianhänge in diesem Forum erstellen.

Suche nach:
Gehe zu:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.014s | 14 Queries | GZIP : On ]