Exemple #1
0
    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]);                        
    }