01.03.2013 Aufrufe

Diplomarbeit (*.pdf - 5,3MB) - Faculty of Computer Science ...

Diplomarbeit (*.pdf - 5,3MB) - Faculty of Computer Science ...

Diplomarbeit (*.pdf - 5,3MB) - Faculty of Computer Science ...

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

Darüber hinaus gilt es beim Überlappungstest zu beachten, dass möglichst<br />

immer zuerst die Hauptachsen zu testen sind, da sich diese wie gezeigt<br />

einfacher bestimmen lassen. Abbildung 4-26 zeigt die Implementierung des<br />

Überlappungstests.<br />

public class OBBOverlap {<br />

}<br />

final double eps = 1e-6;<br />

double[][] Bf = new double[3][3];<br />

public boolean obb_overlap(double[][] B, double[] T, double[] a,<br />

double[] b) {<br />

Bf[0][0]= Math.abs(B[0][0])+eps;<br />

Bf[0][1]= Math.abs(B[0][1])+eps;<br />

Bf[0][2]= Math.abs(B[0][2])+eps;<br />

Bf[1][0]= Math.abs(B[1][0])+eps;<br />

Bf[1][1]= Math.abs(B[1][1])+eps;<br />

Bf[1][2]= Math.abs(B[1][2])+eps;<br />

Bf[2][0]= Math.abs(B[2][0])+eps;<br />

Bf[2][1]= Math.abs(B[2][1])+eps;<br />

Bf[2][2]= Math.abs(B[2][2])+eps;<br />

}<br />

// Fall 1:<br />

if (TestCase1(0,T,a,b)) return false;<br />

if (TestCase1(1,T,a,b)) return false;<br />

if (TestCase1(2,T,a,b)) return false;<br />

// Fall 2:<br />

if (TestCase2(0,T,a,b,B)) return false;<br />

if (TestCase2(1,T,a,b,B)) return false;<br />

if (TestCase2(2,T,a,b,B)) return false;<br />

// Fall 3:<br />

if (TestCase3(0,0,T,a,b,B)) return false;<br />

if (TestCase3(1,0,T,a,b,B)) return false;<br />

if (TestCase3(2,0,T,a,b,B)) return false;<br />

if (TestCase3(0,1,T,a,b,B)) return false;<br />

if (TestCase3(1,1,T,a,b,B)) return false;<br />

if (TestCase3(2,1,T,a,b,B)) return false;<br />

if (TestCase3(0,2,T,a,b,B)) return false;<br />

if (TestCase3(1,2,T,a,b,B)) return false;<br />

if (TestCase3(2,2,T,a,b,B)) return false;<br />

// sonst Überlappung!!<br />

return true;<br />

private boolean TestCase1(int x, double[] T, double[] a, double[] b)<br />

{<br />

return Math.abs(T[x]) > (a[x] + b[0] * Bf[0][x] + b[1] *<br />

Bf[1][x] + b[2]* Bf[2][x]);<br />

}<br />

private boolean TestCase2(int x, double[] T, double[] a, double[] b,<br />

double[][] B) {<br />

return Math.abs(T[0] * B[0][x] + T[1] * B[1][x] + T[2] *<br />

B[2][x]) > (b[x]+ a[0] * Bf[0][x] + a[1] * Bf[1][x] +<br />

a[2] * Bf[2][x]);<br />

}<br />

private boolean TestCase3(int i, int j, double[] T, double[] a,<br />

double[] b,double[][] B) {<br />

return Math.abs(T[(i + 2) % 3] * B[(i + 1) % 3][j]<br />

- T[(i + 1) % 3] * B[(i + 2) % 3][j]) > (a[(i + 1) %<br />

3] * Bf[(i + 2) % 3][j] + a[(i + 2) % 3] * Bf[(i + 1)<br />

% 3][j] + b[(j + 1) % 3] * Bf[i][(j + 2) % 3] + b[(j<br />

+ 2) % 3] * Bf[i][(j + 1) % 3]);<br />

}<br />

Abb. 4-26 Implementierung des OBB-Überlappungstests<br />

94

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!