Triangle.prototype.calculateTransform = function() { var p1x = 0.0; var p1y = 0.0; var p1z = 0.0; var p2x = 0.0; var p2y = 0.0; var p2z = 0.0; var p3x = 0.0; var p3y = 0.0; var p3z = 0.0; var p1p2 = Utils.distance3D(this.x1, this.y1, this.z1, this.x2, this.y2, this.z2); var p1p3 = Utils.distance3D(this.x1, this.y1, this.z1, this.x3, this.y3, this.z3); var p2p3 = Utils.distance3D(this.x2, this.y2, this.z2, this.x3, this.y3, this.z3); var b = 0.0; if(p1p2 > p1p3) { if(p1p2 > p2p3) { if(this.y1 < this.y2) { p1x = this.x1; p1y = this.y1; p1z = this.z1; p2x = this.x2; p2y = this.y2; p2z = this.z2; } else { p1x = this.x2; p1y = this.y2; p1z = this.z2; p2x = this.x1; p2y = this.y1; p2z = this.z1; } p3x = this.x3; p3y = this.y3; p3z = this.z3; b = p1p2; } else { if(this.y2 < this.y3) { p1x = this.x2; p1y = this.y2; p1z = this.z2; p2x = this.x3; p2y = this.y3; p2z = this.z3; } else { p1x = this.x3; p1y = this.y3; p1z = this.z3; p2x = this.x2; p2y = this.y2; p2z = this.z2; } p3x = this.x1; p3y = this.y1; p3z = this.z1; b = p2p3; } } else { if(p1p3 > p2p3) { if(this.y1 < this.y3) { p1x = this.x1; p1y = this.y1; p1z = this.z1; p2x = this.x3; p2y = this.y3; p2z = this.z3; } else { p1x = this.x3; p1y = this.y3; p1z = this.z3; p2x = this.x1; p2y = this.y1; p2z = this.z1; } p3x = this.x2; p3y = this.y2; p3z = this.z2; b = p1p3; } else { if(this.y2 < this.y3) { p1x = this.x2; p1y = this.y2; p1z = this.z2; p2x = this.x3; p2y = this.y3; p2z = this.z3; } else { p1x = this.x3; p1y = this.y3; p1z = this.z3; p2x = this.x2; p2y = this.y2; p2z = this.z2; } p3x = this.x1; p3y = this.y1; p3z = this.z1; b = p2p3; } } if(p1x <= p2x) { var tX = p1x; var tY = p1y; var tZ = p1z; p1x = p2x; p1y = p2y; p1z = p2z; p2x = tX; p2y = tY; p2z = tZ; } var hInvert = 1.0; var wInvert = 1.0; var angleZ = Math.atan((p2y - p1y)/(p2x - p1x)); var s = ( p1p2 + p1p3 + p2p3 ) * 0.5; var a = Math.sqrt( s * (s-p1p2) * (s-p1p3) * (s-p2p3) ); var h = ( 2.0 * a ) / b; var theta1 = Math.asin( h / Utils.distance3D(p1x,p1y,p1z,p3x,p3y,p3z) ); var theta2 = Math.asin( h / Utils.distance3D(p2x,p2y,p2z,p3x,p3y,p3z) ); var l = ( h / Math.tan(theta2) ) / b; var r = ( h / Math.tan(theta1) ) / b; var v21 = new Vector(p2x-p1x, p2y - p1y, p2z-p1z); var v23 = new Vector(p2x-p3x, p2y - p3y, p2z-p3z); var cross = new Vector(); v21.cross(v23, cross); if(cross.z > 0) { hInvert = -1.0; } if(p1x == p2x) { hInvert *= -1.0; var temp = r; r = l; l = temp; } var height = this.invSize*h; var width = this.invSize*b; rot = FM.multiply(FM.identity, FM.rotateZ(angleZ)); this.surface.setProperties({ 'border-radius': '0px', 'border-right': this.size*r+'px solid transparent', 'border-left': this.size*l+'px solid transparent', 'border-bottom': this.size+'px solid rgba('+this.red+', '+this.green+', '+this.blue+', 1.0)' }); var cX = (p1x+p2x+p3x)/3.0; var cY = (p1y+p2y+p3y)/3.0; var cZ = (p1z+p2z+p3z)/3.0; var xOff = (p1x+p2x)*.5 - hInvert*h*.5*Math.sin(-angleZ); var yOff = (p1y+p2y)*.5 - hInvert*h*.5*Math.cos(Math.abs(angleZ)); this.mtx = FM.multiply(FM.identity, FM.scale(width*wInvert, height*hInvert, 1.0), rot, FM.move(FM.identity, [xOff,yOff,0])); }
Triangle3D.prototype.calculateTransform = function() { var p1x = 0.0; var p1y = 0.0; var p1z = 0.0; var p2x = 0.0; var p2y = 0.0; var p2z = 0.0; var p3x = 0.0; var p3y = 0.0; var p3z = 0.0; var p1p2 = Utils.distance3D(this.x1, this.y1, this.z1, this.x2, this.y2, this.z2); var p1p3 = Utils.distance3D(this.x1, this.y1, this.z1, this.x3, this.y3, this.z3); var p2p3 = Utils.distance3D(this.x2, this.y2, this.z2, this.x3, this.y3, this.z3); var a = 0.0; //Area var b = 0.0; //Base var h = 0.0; //Height var l = 0.0; //Left Length var r = 0.0; //Right Length var hInvert = 1.0; var wInvert = 1.0; if(p1p2 > p1p3) { if(p1p2 > p2p3) { if(this.y1 < this.y2) { p1x = this.x1; p1y = this.y1; p1z = this.z1; p2x = this.x2; p2y = this.y2; p2z = this.z2; } else { p1x = this.x2; p1y = this.y2; p1z = this.z2; p2x = this.x1; p2y = this.y1; p2z = this.z1; } p3x = this.x3; p3y = this.y3; p3z = this.z3; b = p1p2; } else { if(this.y2 < this.y3) { p1x = this.x2; p1y = this.y2; p1z = this.z2; p2x = this.x3; p2y = this.y3; p2z = this.z3; } else { p1x = this.x3; p1y = this.y3; p1z = this.z3; p2x = this.x2; p2y = this.y2; p2z = this.z2; } p3x = this.x1; p3y = this.y1; p3z = this.z1; b = p2p3; } } else { if(p1p3 > p2p3) { if(this.y1 < this.y3) { p1x = this.x1; p1y = this.y1; p1z = this.z1; p2x = this.x3; p2y = this.y3; p2z = this.z3; } else { p1x = this.x3; p1y = this.y3; p1z = this.z3; p2x = this.x1; p2y = this.y1; p2z = this.z1; } p3x = this.x2; p3y = this.y2; p3z = this.z2; b = p1p3; } else { if(this.y2 < this.y3) { p1x = this.x2; p1y = this.y2; p1z = this.z2; p2x = this.x3; p2y = this.y3; p2z = this.z3; } else { p1x = this.x3; p1y = this.y3; p1z = this.z3; p2x = this.x2; p2y = this.y2; p2z = this.z2; } p3x = this.x1; p3y = this.y1; p3z = this.z1; b = p2p3; } } if(p1x <= p2x) { var tX = p1x; var tY = p1y; var tZ = p1z; p1x = p2x; p1y = p2y; p1z = p2z; p2x = tX; p2y = tY; p2z = tZ; } var p1 = new Vector(p1x,p1y,p1z); var p2 = new Vector(p2x,p2y,p2z); var p3 = new Vector(p3x,p3y,p3z); var m = new Vector(p1x+p2x,p1y+p2y,p1z+p2z); m.mult(.5, m); var m1 = new Vector(); m1.add(p1).sub(m,m1); this.line5.set(m.x, m.y, m.z, m.x+m1.x, m.y+m1.y, m.z+m1.z); this.p5Surf.mtx = FM.translate(m.x, m.y, m.z); this.p1Surf.mtx = FM.move(FM.identity, [p1x, p1y, p1z]); this.p2Surf.mtx = FM.move(FM.identity, [p2x, p2y, p2z]); this.p3Surf.mtx = FM.move(FM.identity, [p3x, p3y, p3z]); var center = new Vector(p1x+p2x+p3x, p1y+p2y+p3y, p1z+p2z+p3z); center.mult(1.0/3.0, center); var v21 = new Vector(); v21.add(p2).sub(p1,v21); var v23 = new Vector(); v23.add(p3).sub(p2,v23); var v13 = new Vector(); v13.add(p3).sub(p1,v13); var cross = new Vector(); v21.cross(v23, cross); a = 0.5*cross.norm(); h = 2.0*a/b; var mc = new Vector(); mc = m1.cross(cross, mc); mc.normalize(h/2.0, mc); this.line6.set(m.x, m.y, m.z, m.x+mc.x, m.y+mc.y, m.z+mc.z); var diff = new Vector(m.x+mc.x, m.y+mc.y, m.z+mc.z); this.p6Surf.mtx = FM.translate(diff.x, diff.y, diff.z); var theta1 = Math.asin( h / v13.getLength() ); var theta2 = Math.asin( h / v23.getLength() ); var l = ( h / Math.tan(theta2) ) / b; var r = ( h / Math.tan(theta1) ) / b; cross.normalize(150.0, cross); this.line4.set(center.x, center.y, center.z, center.x + cross.x, center.y + cross.y, center.z + cross.z); this.p4Surf.mtx = FM.translate(center.x, center.y, center.z); // rotateZ first, then rotateX and rotateY var theta = Math.acos(v21.dot(v23) / (v21.norm() * v23.norm())); // angle between v21 and v23 var thetaY = Math.atan2(cross.x, Math.sqrt(cross.z*cross.z + cross.y*cross.y)); var thetaX = Math.atan2(-cross.y, cross.z); this.surface.setProperties({ 'border-radius': '0px', 'border-right': this.size*r+'px solid red', 'border-left': this.size*l+'px solid green', 'border-bottom': this.size+'px solid rgba('+this.red+', '+this.green+', '+this.blue+', 1.0)' }); var xOff = center.x - (center.x-diff.x); var yOff = center.y - (center.y-diff.y); var zOff = center.z - (center.z-diff.z); this.line1.setLineWidth(10); this.line1.set(0, 0, 0, center.x, center.y, center.z); this.mtx = FM.scale(this.invSize*b, this.invSize*h, 1.0); this.mtx = FM.multiply(this.mtx, FM.rotateZ(-theta+Math.PI*.5), FM.rotate(thetaX, thetaY, 0)); this.mtx = FM.move(this.mtx, [xOff, yOff, zOff]); }