import java.awt.*; public class HW08 extends MISApplet{ // MATERIAL PROPERTIES double ambientColor[] = { 0.02, 0.025, 0.0 }; double diffuseColor[] = { 0.7, 0.75, 0.0 }; double specularColor[] = {.7,.8,.0}; double specularPower = 8.0; // LIGHTING PROPERTIES double lightDirections[][] = { {1,1,1}, {-1,0,0} ,{0,-1,1} }; double lightColors[][] = { {1.0,1.0,1.0}, {0.9,0.0,0.45}, {0.0,0.5,0.9} }; Matrix4x4 zoo; double zoom = 5.0; double rotY = 0.0; double rotX = 0.0; double rotZ = 0.0; double foc = -1.0;//focal length of pinhole camera double vec1[] = new double[3];//temporary 3D vector double vec2[] = new double[3];//temporary 3D vector boolean wired = false; Geometry ball; public void initialize() { for (int l = 0 ; l < lightDirections.length ; l++) normalize(lightDirections[l]); ball = new Geometry(); ball.northGlobe(24,12); } public void initFrame(double time) { zoom = 5.0 +Math.sin(0.4*time) * .1; lightColors[0][1] = 0.5+Math.cos(1.5*time)*0.5; lightColors[0][1] = 0.5+Math.cos(1.0*time)*0.5; lightColors[0][2] = 0.5+Math.cos(2.0*time)*0.5; lightDirections[0][0] = Math.cos(time) *Math.cos(time) * .5; lightDirections[0][1] = Math.sin(time)*Math.cos(time) * .5; lightDirections[0][2] = Math.sin(time) * .5; normalize(lightDirections[0]); } /** Overriden method that must define frame in doube pix[] array */ public void computeImage(double time){ initFrame(time); //paint the backdrop for(int i=0;i "+ // "<"+B[0]+","+B[1]+"> "+ // "<"+C[0]+","+C[1]+"> "); //sort on vertical position double[][] list = new double[][] { A, B, C}; list = mergeSort(list); int topRGB[] = new int[3]; int midRGB[] = new int[3]; int botRGB[] = new int[3]; int leftRGB[] = new int[3]; int rightRGB[] = new int[3]; topRGB = new int[] { (int) list[0][3] , (int) list[0][4],(int) list[0][5]} ; midRGB = new int[] {(int) list[1][3] , (int) list[1][4],(int) list[1][5]} ; botRGB = new int[] {(int) list[2][3] , (int) list[2][4],(int) list[2][5]} ; double f = (list[1][1] - list[0][1]); f= f/ (list[2][1] - list[0][1]); int projX = (int)lerp(f,list[0][0],list[2][0]); int projZ = (int)lerp(f,list[0][2],list[2][2]); int projR = (int)lerp(f,botRGB[0],topRGB[0]); int projG = (int)lerp(f,botRGB[1],topRGB[1]); int projB = (int)lerp(f,botRGB[2],topRGB[2]); int leftX=-1; int rightX=-1; int leftZ=-1; int rightZ=-1; if(projX0&&i0&&j 0) for (int i = 0 ; i < 3 ; i++) diffuse[i] = diffuseColor[i] * n_dot_l; else for (int i = 0 ; i < 3 ; i++) diffuse[i] = 0; // COMPUTE REFLECTION DIRECTION for (int i = 0 ; i < 3 ; i++) reflection[i] = 2 * n_dot_l * normal[i] - lightDirections[l][i]; double r_dot_e = dot(reflection, eyeDirection); // COMPUTE SPECULAR if (r_dot_e > 0) { double specularFactor = Math.pow(r_dot_e, specularPower); for (int i = 0 ; i < 3 ; i++) specular[i] = specularColor[i] * specularFactor; } else for (int i = 0 ; i < 3 ; i++) specular[i] = 0; // ADD DIFFUSE AND SPECULAR for (int i = 0 ; i < 3 ; i++) color[i] += lightColors[l][i] * (diffuse[i] + specular[i]); } // SEND COLOR TO THE FRAME BUFFER for (int i = 0 ; i < 3 ; i++) { double shade = Math.max(0, Math.min(1.0, color[i])); rgb[i] = (int)(255 * shade); } og[3] = rgb[0]; og[4] = rgb[1]; og[5] = rgb[2]; } /** Universal Merge sort using dist function and point P */ private double[][] mergeSort(double[][] m){ //sub-problem arrays and result double[][] left, right, result; //base cases if(m.length <= 1) return m; //find middle and create and fille sub-problem arrays int middle = m.length/2; left = new double[middle][6]; right = new double[m.length-middle][6]; for(int j=0;j 0) for (int i = 0 ; i < 3 ; i++) diffuse[i] = diffuseColor[i] * n_dot_l; else for (int i = 0 ; i < 3 ; i++) diffuse[i] = 0; // COMPUTE REFLECTION DIRECTION for (int i = 0 ; i < 3 ; i++) reflection[i] = 2 * n_dot_l * normal[i] - lightDirections[l][i]; double r_dot_e = dot(reflection, eyeDirection); // COMPUTE SPECULAR if (r_dot_e > 0) { double specularFactor = Math.pow(r_dot_e, specularPower); for (int i = 0 ; i < 3 ; i++) specular[i] = specularColor[i] * specularFactor; } else for (int i = 0 ; i < 3 ; i++) specular[i] = 0; // ADD DIFFUSE AND SPECULAR for (int i = 0 ; i < 3 ; i++) color[i] += lightColors[l][i] * (diffuse[i] + specular[i]); } // SEND COLOR TO THE FRAME BUFFER for (int i = 0 ; i < 3 ; i++) { double shade = Math.max(0, Math.min(1.0, color[i])); rgb[i] = (int)(255 * shade); } } } // USEFUL MATH public void normalize(double vec[]) { double len = norm(vec); for (int i = 0 ; i < 3 ; i++) vec[i] /= len; } public double norm(double vec[]) { return Math.sqrt(dot(vec, vec)); } public double dot(double a[], double b[]) { return a[0] * b[0] + a[1] * b[1] + a[2] * b[2]; } // WORKING VARIABLES double color[] = new double[3]; double diffuse[] = new double[3]; double specular[] = new double[3]; double point[] = {0,0,0}; double normal[] = {0,0,0}; double eyeDirection[] = {0,0,1}; double reflection[] = {0,0,0}; double radius = 0.2; }