Diplomarbeit (*.pdf - 5,3MB) - Faculty of Computer Science ...
Diplomarbeit (*.pdf - 5,3MB) - Faculty of Computer Science ...
Diplomarbeit (*.pdf - 5,3MB) - Faculty of Computer Science ...
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