package geometry._theory { import flash.geom.Vector3D; import triga.shapes.Axis; import triga.shapes.Label; import triga.shapes.Tick; import triga.shapes.XYZ; /** * @author Nicolas Barradeau * http://en.nicoptere.net */ public class B_VectorOperations extends BaseScene { public function B_VectorOperations() { cameraDistance = -250; setup(); addMesh( new XYZ( 1000, 1000, 1000, WHITE ) ); var p0:Vector3D = new Vector3D(); var p1:Vector3D = new Vector3D( 50,50,50 ); var p2:Vector3D = new Vector3D( -50,100,-25 ); var v0:Axis = new Axis( p0, p1, 1, BLUE ); var v1:Axis = new Axis( p0, p2, 1, YELLOW ); addMesh( v0, new Label( p0, 'p0' ) ); addMesh( v1, new Label( p1, 'p1' ) ); addMesh( new Label( p2, 'p2' ) ); //ADD var add:Vector3D = p1.add( p2 ); var addition:Axis = new Axis( p0, add, 1, GREEN ); addMesh( addition, new Label( add, 'p1.add( p2 )', GREEN.color, 10 ) ); var addadd:Vector3D = p1.add( p1.add( p2 ) ); var additionAddition:Axis = new Axis( p1, addadd, 1, GREEN ); addMesh( additionAddition, new Label( addadd, ' p1.add( p1.add( p2 ) )', GREEN.color, 10 ) ); //SUBTRACT var sub:Vector3D = p1.subtract( p2 ); var subtraction:Axis = new Axis( p0, sub, 1, RED ); addMesh( subtraction, new Label( sub, 'p1.subtract( p2 )', RED.color, 10 ) ); var subadd:Vector3D = p1.add( p1.subtract( p2 ) ); var subtractionAddition:Axis = new Axis( p1, subadd, 1, RED ); addMesh( subtractionAddition, new Label( subadd, ' p1.add( p1.subtract( p2 ) )', RED.color, 10 ) ); var subsub:Vector3D = p0.subtract( p1.subtract( p2 ) ); var subtractionSubtraction:Axis = new Axis( p0, subsub, 1, YELLOW ); addMesh( subtractionSubtraction, new Label( subsub, ' p0.subtract( p1.subtract( p2 ) )', YELLOW.color, 10 ) ); //crossproduct of 2 vectors is a vector perpendicular to the other two var cp:Vector3D = p1.crossProduct( p2 ); //normalization divides each X/Y/Z component by the length of the vector cp.normalize(); //scalar multiplication multiplies each component X/Y/Z by a number cp.scaleBy( 50 ); var cross:Axis = new Axis( p0, cp, 1, PURPLE ); addMesh( cross, new Label( cp, 'cp = p1.crossProduct( p2 )\ncp.normalize()\ncp.scaleBy( 50 )', PURPLE.color, 10 ) ); addChild( GlobalTextField.instance ); //dot product gives the cosine of the angle between two vectors. _trace( 'p1.dotProduct( p2 ) = ', p1.dotProduct( p2 ), ' > 0 : the 2 vectors head in the same direction' ); _trace( 'p2.dotProduct( sub ) = ', p2.dotProduct( sub ), ' < 0 : the 2 vectors head in opposite directions' ); _trace( 'p1.dotProduct( cp ) = ', p1.dotProduct( cp ), ' = 0 : the 2 vectors are perpendicular' ); _trace( '----------------------------------' ); _trace( 'p1.length', p1.length ); _trace( 'p2.length', p2.length ); _trace( '----------------------------------' ); p1.normalize(); p2.normalize(); cp.normalize(); var angle:Number; angle = Math.acos( p1.dotProduct( p2 ) ); _trace( 'angle( p1 <-> p2 )', angle * 180 / Math.PI, '°' ); angle = Math.acos( p1.dotProduct( cp ) ); _trace( 'angle( p1 <-> cp )', angle * 180 / Math.PI, '°' ); } } }