package jembench.parallel.raytrace; public class MyVector { /** * Gibt einen um den Faktor f skalierten Vektor v zur�ck. * @param v der Vector der skaliert wird * @param f der Faktor mit dem der Vektor skaliert wird * @return der skalierte Vektor */ static void scale(double[]r, double[]a, double f){ r[0] = a[0]*f; r[1] = a[1]*f; r[2] = a[2]*f; } /** * Gibt den normalisierten Vektor von v zur�ck. * @param v der zu normalisierende Vektor * @return der normalisierte Vektor */ static void normalize(double[]r, double[]a){ double l = length(r); r[0] = a[0]*(1/l); r[1] = a[1]*(1/l); r[2] = a[2]*(1/l); } /** * Berechnet die L�nge des Vektors v. * @param v Vektor dessen L�nge zur�ckgegeben wird * @return die L�nge des Vektors v */ static double length(double[]v){ return (double)Math.sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]); } /** * Multipliziert den Vektor v und die 3x3 Matrix M. * @param a der zu multiplizierende Vektor * @param M die zu multiplizierende Matrix * @return das Produkt von v und M */ static void mul_mtx(double[]r, double[]a, double[][]M){ r[0] = a[0]*M[0][0] +a[1]*M[0][1] +a[2]*M[0][2]; r[1] = a[0]*M[1][0] +a[1]*M[1][1] +a[2]*M[1][2]; r[2] = a[0]*M[2][0] +a[1]*M[2][1] +a[2]*M[2][2]; } /** * Rotiert den Vektor v um die Achse ax um alpha Grad. * @param a der zu rotierende Vektor * @param ax die Rotationsachse * @param alpha der Rotationswinkel(Grad) * @return der rotierte Vektor */ static void rotate(double []r, double[]a, double[]ax2, double alpha){ alpha = Math.toRadians(alpha); normalize(ax2, ax2); double c = Math.cos(alpha); double s = Math.sin(alpha); //Rotationsmatrix: double M[][] = { {c+ax2[0]*ax2[0]*(1-c), ax2[0]*ax2[1]*(1-c)-ax2[2]*s, ax2[0]*ax2[2]*(1-c)+ax2[1]*s}, { ax2[1]*ax2[0]*(1-c)+ax2[2]*s, c+ax2[1]*ax2[1]*(1-c), ax2[1]*ax2[2]*(1-c)-ax2[0]*s}, { ax2[2]*ax2[0]*(1-c)-ax2[1]*s, ax2[2]*ax2[1]*(1-c)+ax2[0]*s, c+ax2[2]*ax2[2]*(1-c)} }; mul_mtx(r, a, M); } /** * Berechnet das Skalarprodukt zweier Vektoren. * @param a erster Vektor * @param b zweiter Vektor * @return Skalarprodukt der beiden Vektoren */ static double dotProd(double[]a,double[]b){ return a[0]*b[0] + a[1]*b[1] + a[2]*b[2]; } /** * Berechnet das Kreuzprodukt zweier Vektoren. * @param a erster Vektor * @param b zweiter Vektor * @return Kreuzprodukt der beiden Vektoren */ static void crossProd(double[]r, double[]a, double[]b){ r[0] = a[1]*b[2] - a[2]*b[1]; r[1] = a[2]*b[0] - a[0]*b[2]; r[2] = a[0]*b[1] - a[1]*b[0]; } /** * Addiert 2 Vektoren * * @param a erster Vektor * @param b zweiter Vektor * @return Summer der beiden Vektoren */ static void add(double[]r, double[]a, double[]b){ r[0] = a[0]+b[0]; r[1] = a[1]+b[1]; r[2] = a[2]+b[2]; } /** * Substrahiert 2 Vektoren * * @param a erster Vektor * @param b zweiter Vektor * @return Differenz der beiden Vektoren */ static void sub(double[]r, double[]a, double[]b){ r[0] = a[0]-b[0]; r[1] = a[1]-b[1]; r[2] = a[2]-b[2]; } /** * Berechnet den Verbindungsvektor von 2 Ortsvektoren * * @param a erster Vektor * @param b zweiter Vektor * @return Verbindungsvektor von a nach b */ static void to(double[]r, double[]a, double[]b){ sub(r,b,a); } /** * Berechnet den Ortsvektor eines Punktes auf einer Geraden * * @param v Ursprung der Geraden * @param d Richtungsvektor der Geraden * @param t Entfernung entlang der Geraden * @return Ortsvektor des Punktes v+dt */ static void line(double[]r, double[]p, double[]d, double t){ scale(r, d, t); add(r, r, p); } /** * �berpr�ft ob 2 Vektoren die selben Vorzeichen haben * * @param a erster Vektor * @param b zweiter Vektor * @return haben beide Vektoren das selbe Vorzeichen ? */ static boolean sign(double[]a, double[]b){ if((a[0]>=0 && b[0]>=0) || (a[0]<0 && b[0]<0)){ if((a[1]>=0 && b[1]>=0) || (a[1]<0 && b[1]<0)){ if((a[2]>=0 && b[2]>=0) || (a[2]<0 && b[2]<0)){ return true; } } } return false; } }