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

Aktuelle Zeit: Sa Jul 12, 2025 19:14

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: kleines Matheproblem
BeitragVerfasst: Fr Jan 02, 2004 17:54 
Offline
DGL Member

Registriert: So Okt 12, 2003 14:53
Beiträge: 74
Hi

Ich bin gerade dabei eine Octree klasse zu programmieren und bin da auf ein kleines Problem gestoßen. Und zwar bin ich jetzt schon so weit das meine Welt immer weiter in Boxen aufgeteilt wird, aber ich weiß nicht genau wie man prüfen kann ob ein Vertex sich inerhalb einer Bounding Box befindet.
Ich hab mir da bis jetzt folgendes überlegt: Man erstellt für jede Fläche der Box eine Ebene und prüft dann ob das Vertex sich inerhalb dieser 6 Ebenen Befinden. Nur find ich im Internet nicht genügend Informationen über Ebenen. Kann mir jemand ne Formel sagen womit ich die Infos für eine Ebene anhand eines Dreieckes kriege(Normale hab ich schon :lol: ) und wie ich dann teste ob sich ein Vertex vor oder hinter dieser ebene befindet.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 02, 2004 19:13 
Offline
DGL Member
Benutzeravatar

Registriert: Sa Dez 28, 2002 11:13
Beiträge: 2244
Das mit der BBox geht einfacher, wenn es eine AABB ist, also wenn die Box an den Achsen ausgerichtet ist. Dann hat man ja zwei Punkte min und max. Ein Punkt p liegt dann innerhalb der Box, wenn gilt:

Code:
  1. (p.x>=min.x) and (xp.<=max.x) and
  2. (p.y>=min.y) and (p.y<=max.y) and
  3. (p.z>=min.z) and (p.z<=max.z)


Bei den Ebenen hat man die Normale n und die Entfernung zum Ursprung s. Die Ebenengleichung sieht dann so aus: (n dot x) + d=0

Um die Entfernung eines Punkte p von der Ebene auszurechnen setzt man p in die Gleichung für x ein:
|n.x*p.x+n.y*p.y+n.z*p.z+d|= Entfernung von p von der Ebene (n,d)

Es gibt außerdem noch ein Mathe Tutorial, ein Octree Tutorial und auch verschiedene Mathe Units hier auf der Seite.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Jan 02, 2004 20:27 
Offline
DGL Member

Registriert: So Okt 12, 2003 14:53
Beiträge: 74
Danke für die Antwort.

Zitat:
Das mit der BBox geht einfacher, wenn es eine AABB ist, also wenn die Box an den Achsen ausgerichtet ist.

Man bin ich ... :x . Das hätte mir auch echt selber einfallen können. Naja ist heut nicht mein tag :lol: .

Auch nochmal danke das du mir das mit den Ebenen erklärt hast. Kann ich irgendwann sicherlich noch gebrauchen.

Zitat:
Es gibt außerdem noch ein Mathe Tutorial, ein Octree Tutorial und auch verschiedene Mathe Units hier auf der Seite.

Hm das mathe Tutorial erklärt nicht wirklich das was ich hier wissen wollte und das Octree Tutorial erklärt nur das Prinzip der Octrees.

Naja falls die klasse jetzt auf anhieb richtig arbeiten sollte, dann... wär ich sehr froh :lol:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 10, 2004 11:53 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 20, 2003 22:26
Beiträge: 38
Wohnort: Dresden (noch)
LarsMiddendorf hat geschrieben:
Code:
  1. (p.x>=min.x) and (p.x<=max.x) and
  2. (p.y>=min.y) and (p.y<=max.y) and
  3. (p.z>=min.z) and (p.z<=max.z)


So einen Code, der vermutlich sehr oft ausgeführt wird, kann man dann natürlich noch optimieren, damit ihn die CPU schneller bearbeiten kann.

Mal ein Beispiel:
Code:
  1.  
  2. Var TestValue:Single;
  3.     TestAccess:Cardinal absolute TestValue;
  4. begin
  5. Result:=False;
  6. TestValue:=((p.x-min.x)*(max.x-p.x)); If TestAccess >= $80000000 then exit;
  7. TestValue:=((p.y-min.y)*(max.y-p.y)); If TestAccess >= $80000000 then exit;
  8. TestValue:=((p.x-min.z)*(max.x-p.z)); If TestAccess >= $80000000 then exit;
  9. Result:=True;
  10.  

Das ist jedenfalls das schnellste was mir in Delphi direkt einfällt.
Mit dem Inline Assembler könnte man vielleicht noch etwas mehr rausholen, aber ich hab bis jetzt noch keinen Code geschrieben, da meine Kollisionen mit der Kugelmethode gut funktionieren.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 10, 2004 15:20 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 13, 2002 12:18
Beiträge: 1063
Und wo ist da jetzt der Vorteil?
Die Vergleiche ersetzt du durch Subtraktionen und fügst zusätzlich noch drei Multiplikationen und drei Integervergleiche hinzu. Zusätzlich verhinderst du effizient, dass Testvalue vom Optimizer in einem Fließkommaregister gehalten werden kann (und Testaccess natürlich auch nicht in einem CPU Register).
Der ursprüngliche Code kann auch früher abbrechen, da man normalerweise davon aus gehen kann, dass full boolean evaluation ausgeschaltet ist.

_________________
Viel Spaß beim Programmieren,
Mars
http://www.basegraph.com/


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa Jan 10, 2004 20:52 
Offline
DGL Member
Benutzeravatar

Registriert: Mi Aug 20, 2003 22:26
Beiträge: 38
Wohnort: Dresden (noch)
Ich hab's getestet, es ist wirklich etwas schneller.
Wenn du's mir nicht glaubst, ich hab den Ansatz aus einem Tutorial für Assembly-Optimierung.

Hauptsächlich wird die "FCOMP FSTSW SAHF JNB" Kombination zum Testen von Fließkommazahlen vermieden, die je nach Prozessor auch mal 9-14 Takte dauern kann.
Durch die Subtraktionen und die Multiplikation führe ich jeweils zwei Tests in 9 Takten aus, der Integervergleich(1 Takt) und der konditionelle Sprung brauchen dann noch 2-3 Takte.

Wieso sollte man TestValue denn in einem Register halten? Zum Beginn jedes neuen Testes muss der alte Wert doch eh verworfen werden.
Bis auf das eine Speichern und Neuladen als Integer werden die Register eigentlich sehr effizient genutzt. Der Wert $80000000 wird außerdem direkt aus dem Code gelesen und muss nicht geladen werden.


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


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 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.008s | 16 Queries | GZIP : On ]