////////////************************** // DRAWING ////////////************************** // preload images (myImages) function loadImages() { myImages = new Array(12); myImages[0] = new Image(); myImages[0].src = "images/0.gif"; for (var i=0; i<12; i++) { myImages[i+1] = new Image(); myImages[i+1].src = "images/dots"+i+".gif"; } } // craete an empty image function createImage(name, codeS) { document.write(''); document.write("\n"); } function createRandomImage(name) { var number = Math.floor(12*Math.random()); document.write(""); } function createImageArray() { for (var y = 0; y < MAX_Y; y++) { for (var x = 0; x < MAX_X; x++) { createImage("x" + x + "y" + y, "mouseOver("+x+ "," +y+");"); } document.write("
"); } } function drawRandomImage() { var x = Math.floor(MAX_X*Math.random()); var y = Math.floor(MAX_Y*Math.random()); var i = Math.floor(12*Math.random()); document.images[x + MAX_X*y].src = myImages[i].src; } function drawImage(x,y,i) { var k = x + MAX_X*y; if ((k>=0) && (k<(MAX_X)*(MAX_Y))) document.images[k].src = myImages[i].src; } function drawSphere(x, y, r, i) { for (var alpha = 0; alpha < 2*3.14; alpha+=3.14/12) { drawImage(Math.round(x + r*Math.sin(alpha)), Math.round(y + r*Math.cos(alpha)), i); } } function sign(a) { return (a>0) ? 1 : ((a<0) ? -1 : 0); } function drawLine(ax, ay, bx, by, im) { var dx = bx - ax; var dy = by - ay; var sx = sign(dx); var sy = sign(dy); var adx,ady; if ((adx=Math.abs(dx)) > (ady=Math.abs(dy))) { var ky = dy/adx; var y = ay; var x = ax; for (var i = 0; i<=adx; x+=sx, y+=ky, i++) drawImage(x,Math.round(y), im); } else { var kx = dx/ady; var x = ax; var y = ay; for (var i = 0; i<=ady; x+=kx, y+=sy, i++) drawImage(Math.round(x),y, im); } } // Draw a line into a buffer function drawLineBuff(ax, ay, bx, by, buffer) { var dx = bx - ax; var dy = by - ay; var sx = sign(dx); var sy = sign(dy); var ady=Math.abs(dy); var kx = dx/ady; var x = ax; var y = ay; for (var i = 0; i<=ady; x+=kx, y+=sy, i++) buffer[y] = Math.round(x); } function drawPolygon(points, im) { minbuff = new Array(MAX_Y); maxbuff = new Array(MAX_Y); var miny = 1000, maxy = -1000; for (var i=0; i < points.length; i++) { var a = points[i]; var b = points[(i+1)%points.length]; if (a.y > b.y) { drawLineBuff(a.x, a.y, b.x, b.y, maxbuff); if (b.y < miny) miny = b.y; if (a.y > maxy) maxy = a.y; } if (a.y < b.y) { drawLineBuff(a.x, a.y, b.x, b.y, minbuff); if (a.y < miny) miny = a.y; if (b.y > maxy) maxy = b.y; } } for (var y=miny; y<=maxy; y++) for (var x=minbuff[y]; x<=maxbuff[y]; x++) drawImage(x,y,im); } function drawWirePolygon(point, im) { for (var i=0; i< points.length; i++) { var a = points[i]; var b = points[(i+1)%points.length]; drawLine(a.x, a.y, b.x, b.y, im); } } function animateSphere() { x = 10; y = 10; // clear // if (r != 2) // drawSphere(x, y, r, 0); if (r>=9) r = 1; else drawSphere(x, y, r, Math.floor(12*Math.random())); setTimeout("animateSphere()", 500); } function createMatrix() { this.a03 = this.a01 = this.a02 = 0; this.a10 = this.a13 = this.a12 = 0; this.a20 = this.a21 = this.a23 = 0; this.a30 = this.a31 = this.a32 = 0; this.a00 = this.a11 = this.a22 = this.a33 = 1; } function createMatrixRotY(fi) { this.a00 = Math.cos(fi); this.a01=0; this.a02=Math.sin(fi); this.a03=0; this.a10 = this.a13 = this.a12 = 0; this.a11=1; this.a20 = -Math.sin(fi); this.a21=0; this.a22=Math.cos(fi); this.a23=0; this.a30 = this.a31 = this.a32 = 0; this.a33=1; } function createMatrixRotX(fi) { this.a00 = 1; this.a01 = this.a02 = this.a03 = 0; this.a10 = 0; this.a11 = Math.cos(fi); this.a12=Math.sin(fi); this.a13=0; this.a20 = 0; this.a21 = -Math.sin(fi); this.a22=Math.cos(fi); this.a23=0; this.a30 = this.a31 = this.a32 = 0; this.a33=1; } // constructor function Point3D(x, y, z) { this.x = x; this.y = y; this.z = z; this.w = 1; } // Create model of an object from the array of 3D points // and the array of polygons (indices into the points array separated by -1) function createModel(model, points, edges) { var i,j; model.points = new Array(points.length/3); for (i=0, j=0; i < points.length; j++) { model.points[j] = new Point3D(points[i++],points[i++], points[i++]); } // only copy by reference model.edges = edges; } function transformPoint(result, point, matrix) { result.x = point.x * matrix.a00 + point.y*matrix.a10 + point.z*matrix.a20 + point.w*matrix.a30; result.y = point.x * matrix.a01 + point.y*matrix.a11 + point.z*matrix.a21 + point.w*matrix.a31; result.z = point.x * matrix.a02 + point.y*matrix.a12 + point.z*matrix.a22 + point.w*matrix.a32; result.w = point.x * matrix.a03 + point.y*matrix.a13 + point.z*matrix.a23 + point.w*matrix.a33; } function normalize(point) { point.x/=point.w; point.y/=point.w; point.z/=point.w; } function MatrixCompose(m1, m2) { var r,c; for(r=0; r<4; r++) for(c=0; c<4; c++) this["a"+r+c] = m1["a" + r + "0"]*m2["a0" + c] + m1["a" + r + "1"]*m2["a1" + c] + m1["a" + r + "2"]*m2["a2" + c] + m1["a" + r + "3"]*m2["a3" + c]; } function matrixCopy(dest, src) { var r,c; for(r=0; r<4; r++) for(c=0; c<4; c++) dest["a"+r+c] = src["a"+r+c]; } function rotate(matrix) { fiY+=0.1; fiX+=0.2; var m1 = new createMatrixRotY(fiY); var m2 = new createMatrixRotX(fiX); var m3 = new MatrixCompose(m1, m2); matrixCopy(matrix, m3); } function drawWireModel(model, matrix, im) { // crate an array of tranformed points var i; var transformed = new Array(model.points.length); for (i=0; i < model.points.length; i++) { transformed[i] = new Object(); transformPoint(transformed[i], model.points[i], matrix); normalize(transformed[i]); } var a,b; // draw the edges for (i=0; i < model.edges.length; i+=2) { a = transformed[model.edges[i]]; b = transformed[model.edges[i+1]]; drawLine( Math.round(centerX + a.x*PERSP/(a.z+centerZ)), Math.round(centerY + a.y*PERSP/(a.z+centerZ)), Math.round(centerX + b.x*PERSP/(b.z+centerZ)), Math.round(centerY + b.y*PERSP/(b.z+centerZ)), im); } } // create an axis aligned box function Box(x, y, z, points, edges) { x/=2; y/=2; z/=2; points[0] = new Point3D(-x,-y,-z); points[1] = new Point3D(x,-y,-z); points[2] = new Point3D(x,y,-z); points[3] = new Point3D(-x,y,-z); points[4] = new Point3D(-x,-y,z); points[5] = new Point3D(x,-y,z); points[6] = new Point3D(x,y,z); points[7] = new Point3D(-x,y,z); var i=0; edges[i++] = 0; edges[i++] = 1; edges[i++] = 1; edges[i++] = 2; edges[i++] = 2; edges[i++] = 3; edges[i++] = 3; edges[i++] = 0; edges[i++] = 4; edges[i++] = 5; edges[i++] = 5; edges[i++] = 6; edges[i++] = 6; edges[i++] = 7; edges[i++] = 7; edges[i++] = 4; edges[i++] = 0; edges[i++] = 4; edges[i++] = 1; edges[i++] = 5; edges[i++] = 2; edges[i++] = 6; edges[i++] = 3; edges[i++] = 7; this.points = points; this.edges = edges; } function animateRotation() { drawWireModel(model, matrix, 0); rotate(matrix); drawWireModel(model, matrix, 5); setTimeout("animateRotation()", 100); }