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

Aktuelle Zeit: Di Jul 15, 2025 17:26

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 2 Beiträge ] 
Autor Nachricht
BeitragVerfasst: Do Apr 03, 2008 15:37 
Offline
DGL Member

Registriert: Mi Apr 02, 2008 14:30
Beiträge: 1
Hallo! :)

Erstmal ein großes Lob. Ich habe lange in Google gesucht, bis ich endlich fündig geworden bin und hier das einzige deutsche Tutorial zum Seperating Axis Theorem gefunden habe.
Nun habe ich versucht, es zu implementieren, habe allerdings noch Probleme, vielleicht könnt ihr mir mal über die Finger schauen.

Hier mal mein Versuch, an das Problem heranzugehen, ob sich zwei Vierecke (nicht Rechtecke!) in einem zweidimensionalen Raum scheiden.

Dies sind die Punkte der Vierecke:

Viereck 1:
(190 | 160)
(290 | 160)
(290 | 260)
(190 | 260)

Viereck 2:
(100 | 100)
(200 | 100)
(165 | 200)
(100 | 200)

Im angefügten Bild kann man erkennen, dass sich beide Vierecke nicht überlappen.

Nun berechne ich für jede Viereckseite die Normale. Für die erste Seite des Vierecks ginge das doch folgendermaßen:
Code:
  1.  
  2. (290) - (190) = (100)
  3. (160)   (160)   (  0)
  4.  

Beide Werte vertauschen und bei einem das Vorzeichen ändern:
Code:
  1.  
  2. (100) -> (   0)
  3. (  0)    (-100)
  4.  

Damit hat man die Normale. Diese muss dann noch zu einem Einheitsvektor konvertiert werden:

Wurzel aus ( 100² + 0²) ist gleich 100.
Dann den Vektor durch 100 teilen:
Code:
  1.  
  2. (   0) / 100 = (   0 / 100) = ( 0)
  3. (-100)         (-100 / 100)   (-1)
  4.  

Nun müssen alle anderen Ortsvektoren der gegebenen Punkte (beider Vierecke) auf diesen Vektor projeziert werden, es müssen also die Skalarprodukte gebildet werden:

Beispielhaft für den dritten Ortsvektor des zweiten Vierecks (165 | 200):
Code:
  1.  
  2. Skalarprodukt = (165 * -1) + (200 * 0) = -165
  3.  

Nun speichere ich für jede Normale diesen Wert, sodass ich für jede Normale genau 8 dieser Skalarprodukte habe (4 vom ersten Viereck und 4 vom Zweiten). Dann gucke ich, der kleinste Wert der vier Werte vom ersten Viereck größer ist als der größte Wert der vier Werte vom zweiten Viereck oder ob der größte Wert der vier Werte vom ersten Viereck kleiner ist als der kleinste Wert der vier Werte vom zweiten Viereck, richtig?
Wenn nun herauskommen sollte, dass das einer diese Fälle zutrifft, gibt es keine Kollision. Wenn ich das ganze aber auf die von mir angehängte Grafik anwende (die zwei Vierecke), dann bekomme ich eine Kollision, obwohl es keine gibt. Ich bekomme zwar auch immer eine Kollision, _wenn_ es keine gibt, aber eben manchmal auch eine, wenn es gar keine gibt.
Habe ich einen Fehler in meiner Rechnung?
Es wäre toll, wenn mir da jemand von euch helfen könnte.

Vielen Danke und mit Gruß,
ActiviT




PS: das ganze ist in Javascript geschrieben. Nützt es euch was, wenn ich den Code hier poste?


Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Apr 04, 2008 09:09 
Offline
DGL Member

Registriert: Di Jun 06, 2006 09:59
Beiträge: 474
vllt zeigen manche normalen nach innen, und manche nach ausßen.

_________________
Bild


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 6 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:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.007s | 14 Queries | GZIP : On ]