/*----------------------------------------------------------------------------------------------*/ /** skew.as (c) ATOMGAS 2002, Emile Anclin (satelit) , Luzfer Altenberg free to use as long as this comment stays here */ /*----------------------------------------------------------------------------------------------*/ //MATH Extensions Math.scalarProd = function(a,b){ return a[0]*b[0]+a[1]*b[1]; } Math.norm = function(a){ return Math.sqrt(a[0]*a[0]+a[1]*a[1]); } //END MATH Extensions /*----------------------------------------------------------------------------------------------*/ function skew(){ var mc = this.quad_mc; mc.inner_mc._rotation = mc._rotation = mc._x = mc._y = 0; mc._xscale = mc._yscale = 100; mc.inner_mc._xscale = mc.inner_mc._yscale = 100; //here beginns the Math.mess(?) (satelit!) //current transformation var tTrafo = [ [ this.dot2_mc._x-this.dot1_mc._x, this.dot3_mc._x-this.dot1_mc._x, this.dot1_mc._x ], [ this.dot2_mc._y-this.dot1_mc._y, this.dot3_mc._y-this.dot1_mc._y, this.dot1_mc._y ] ]; // a vector a = [ tTrafo[0][0], tTrafo[1][0] ] //e vector e = [ tTrafo[0][1], tTrafo[1][1] ] //outer rotation : Winkelhalbierende auf x-Achse drehen var Rot = ( Math.atan2(a[1],a[0]) + Math.atan2(e[1],e[0]) )/2 ; mc._rotation = Rot*180/Math.PI; cos = Math.cos(-Rot); sin = Math.sin(-Rot); eRot = [ cos*e[0] -sin*e[1], sin*e[0] +cos*e[1] ] aRot = [ cos*a[0] -sin*a[1], sin*a[0] +cos*a[1] ] //outer scale : Skalieren zum rechten Winkel s = eRot[1]/eRot[0]; mc._yscale = 100*s; mc._xscale = 100; aScl = [ aRot[0], aRot[1]/s ] ; eScl = [ eRot[0], eRot[1]/s ] ; //inner rotation : Zurückdrehen var iRot = Math.atan2(aScl[1],aScl[0]); mc.inner_mc._rotation = iRot*180/Math.PI; //inner scale : Die veränderten Vektoren skalieren ... mc.inner_mc._xscale = Math.norm(aScl); mc.inner_mc._yscale = Math.norm(eScl); //outer position mc._x = tTrafo[0][2]; mc._y = tTrafo[1][2]; //------------------------------------------------------- //DEMO vector Lines zeichnen demo_mc = this.createEmptyMovieClip("line_m",1); demo_mc.lineStyle(1,0xFF0000); demo_mc.moveTo(this.dot1_mc._x, this.dot1_mc._y); demo_mc.lineTo( eScl[0] + this.dot1_mc._x, eScl[1] + this.dot1_mc._y); demo_mc.lineStyle(1,0x00FF00); demo_mc.moveTo(this.dot1_mc._x, this.dot1_mc._y); demo_mc.lineTo( aScl[0] + this.dot1_mc._x, aScl[1] + this.dot1_mc._y); demo_mc.lineStyle(1,0x0000FF); demo_mc.moveTo(this.dot1_mc._x, this.dot1_mc._y); demo_mc.lineTo( a[0] + this.dot1_mc._x, a[1] + this.dot1_mc._y); }