package jembench.parallel.raytrace; import java.util.Vector; public class Tri{ double[] a; double[] b; double[] c; int[]rgb; double reflection; public Tri(double ax, double ay, double az, double bx, double by, double bz, double cx, double cy, double cz, int red, int green, int blue, double ref){ a = new double[]{ax,ay,az}; b = new double[]{bx,by,bz}; c = new double[]{cx,cy,cz}; rgb=new int[]{red,green,blue}; reflection = ref; } public String toString(){ return new String("(("+this.a[0]+this.a[1]+this.a[2]+")("+this.b[0]+this.b[1]+this.b[2]+")("+this.c[0]+this.c[1]+this.c[2]+")("+this.rgb[0]+this.rgb[1]+this.rgb[2]+"))"); } public void getPlane(double[]r, double[]tmp1, double[]tmp2, double[]tmp3){ if(r==null || r.length<6) r = new double[6]; if(tmp1==null || tmp1.length<3) tmp1 = new double[3]; if(tmp1==null || tmp2.length<3) tmp2 = new double[3]; if(tmp1==null || tmp3.length<3) tmp3 = new double[3]; MyVector.to(tmp1,a,b); MyVector.to(tmp2,a,c); MyVector.crossProd(tmp3, tmp1, tmp2); MyVector.normalize(tmp1, tmp3); r[0] = a[0]; r[1] = a[1]; r[2] = a[2]; r[3] = tmp1[0]; r[4] = tmp1[1]; r[5] = tmp1[2]; } /** * Erzeugt eine zuf�llige Szene, gef�llt mit Dreiecken. * * @param tri_num Anzahl von Dreiecken * @param tri_maxsize Maximale Gr��e der Dreiecke * @param dist2zero Maximale Entfernung zum Koordinatenursprung * @return generierte Szene */ /* public static Vector createRandomTris(int tri_num, double tri_maxsize, double dist2zero){ Vector result = new Vector(0); for(int i=0; i<tri_num; i++){ Random r = new Random(); double ax = (r.nextDouble()-r.nextDouble())*dist2zero; double ay = (r.nextDouble()-r.nextDouble())*dist2zero; double az = (r.nextDouble()-r.nextDouble())*dist2zero; double bx = ax+(r.nextDouble()-r.nextDouble())*tri_maxsize; double by = ay+(r.nextDouble()-r.nextDouble())*tri_maxsize; double bz = az+(r.nextDouble()-r.nextDouble())*tri_maxsize; double cx = ax+(r.nextDouble()-r.nextDouble())*tri_maxsize; double cy = ay+(r.nextDouble()-r.nextDouble())*tri_maxsize; double cz = az+(r.nextDouble()-r.nextDouble())*tri_maxsize; int colr = r.nextInt(256); int colg = r.nextInt(256); int colb = r.nextInt(256); result.addElement(new Tri(ax,ay,az,bx,by,bz,cx,cy,cz,colr,colg,colb,0.95)); } return result; }*/ public static Vector createTris(){ Vector result = new Vector(0); result.addElement(new Tri(0.865F,-6.271F,0.370F, -0.428F,-6.525F,0.773F, 0.816F,-7.231F,1.132F, 129,96,145, 0.95F)); result.addElement(new Tri(-2.171F,1.013F,3.697F, -1.391F,1.458F,4.923F, -1.841F,1.294F,3.171F, 26,91,246, 0.95F)); /*result.addElement(new Tri(-1.805F,0.945F,-1.777F, -1.915F,1.559F,-1.839F, -2.614F,1.289F,-1.160F, 199,67,215, 0.95F)); result.addElement(new Tri(-1.242F,-4.499F,1.120F, -0.307F,-4.425F,0.040F, -3.044F,-3.670F,1.293F, 229,36,49, 0.95F)); result.addElement(new Tri(-3.154F,0.854F,-2.775F, -3.214F,-0.319F,-3.299F, -3.331F,1.849F,-3.681F, 62,117,239, 0.95F)); */ return result; } public double[] reflect(double[]intersection, double[]rayDir){ double[] result = new double[3]; double[] normal = new double[6]; this.getPlane(normal, new double[3], new double[3], new double[3]); normal[0]=normal[3]; normal[1]=normal[4]; normal[2]=normal[5]; MyVector.normalize(normal, normal); MyVector.scale(result, rayDir, -1);//Richtung �ndern MyVector.rotate(result, result, normal, 180);//Um die Normale drehen return result; } }