//u must be sure that the mc has no rect angle class TTriangle { var id:String; var vset:Array; //The Ids of the involved points in the set Of Vertex var v:Array; //Set of the Points(Vertex); var back:MovieClip; //the host MovieClip var dir:TVector3D; //The direction of the positive side; var vt1:TVector; var vt2:TVector; function TTriangle(v1:Array, vset1:Array, vt1_1:TVector, vt2_1:TVector, id1:String, dir1:TVector3D, back1:MovieClip) { v = v1; id = id1; vset = vset1; dir = dir1; back = back1; vt1 = vt1_1; vt2 = vt2_1; } public function render(dist:Number) { if (dist == undefined) { dist = 300; } var v1; var vt; v1 = []; vt = []; vt[0] = new TVector(0, 0); vt[1] = vt1.getCopy(); vt[2] = vt2.getCopy(); for (var i = 0; i<=2; i++) { v1[i] = new TVector(); //trace(v[vset[i]].getPerspective(dist)); v1[i] = v[vset[i]].to2d(v[vset[i]].getPerspective(dist)); } back.createEmptyMovieClip(id, 1); back[id].createEmptyMovieClip(id, 1); back[id][id].createEmptyMovieClip(id, 1); back[id][id][id].createEmptyMovieClip(id, 1); back[id][id][id][id].createEmptyMovieClip(id, 1); back[id]._x = v1[0].x; back[id]._y = v1[0].y; back[id][id][id][id].attachMovie(id, id, 0, {_visible:false}); var l = Number; var vi1 = new TVector(); //vi1 = v1[1].minus(v1[0]); var vi2 = new TVector(); //vi2 = v1[2].minus(v1[0]); var vi3 = new TVector(); //vi3 = v1[2].minus(v1[1]); var k:Number = 0; var a = new TVector(); var b = new TVector(); for (var i = 2; i>=0; i--) { k = 0; //back[id][id][id]._x = -vt[i].x; //back[id][id][id]._y = -vt[i].y; for (var j = 0; j<=2; j++) { if (i != j) { k++; if (k == 1) { vi1 = v1[j].minus(v1[i]); a = vt[j].minus(vt[i]); } else if (k == 2) { vi2 = v1[j].minus(v1[i]); b = vt[j].minus(vt[i]); } } } if (vi1.dotpro(vi2)<=0) { break; } } if (zero(vi1.dotpro(vi2)+Math.sqrt(vi1.len2()*vi2.len2()))) { return 0; } var r:Number = i+1; var tv = new TVector(); var vi3 = new TVector(); var hi = new TVector(); vi3 = vi2.minus(vi1); hi = vi3.getCopy(); hi.scale(-vi1.dotpro(vi3)/vi3.len2()); hi = hi.plus(vi1); hi.unitize(); var t1:Number = vi1.dotpro(hi); var t2:Number = vi1.dotpro(hi); var t0:Number = vi1.dotpro(vi2); t1 = t1*t2; var lemti = Math.sqrt(t1/(t1-t0)); t1 = 1-lemti; tv = hi.getCopy(); tv.scale(t1*tv.dotpro(vi1)); var vx1 = new TVector(lemti*vi1.x, lemti*vi1.y); vx1 = vx1.plus(tv); tv = hi.getCopy(); tv.scale(t1*tv.dotpro(vi2)); var vx2 = new TVector(lemti*vi2.x, lemti*vi2.y); vx2 = vx2.plus(tv); var c = new TVector(); var h = new TVector(); c = b.minus(a); h = c.getCopy(); h.scale(-a.dotpro(c)/c.len2()); h = h.plus(a); h.unitize(); var t1:Number = a.dotpro(h); var t2:Number = b.dotpro(h); var t0:Number = a.dotpro(b); t1 = t1*t2; var lemt = Math.sqrt(t1/(t1-t0)); t1 = 1-lemt; tv = h.getCopy(); tv.scale(t1*h.dotpro(a)); var vy1 = new TVector(lemt*a.x, lemt*a.y); vy1 = vy1.plus(tv); tv = h.getCopy(); tv.scale(t1*tv.dotpro(b)); var vy2 = new TVector(lemt*b.x, lemt*b.y); vy2 = vy2.plus(tv); t0 = Math.atan2(h.x, h.y)/Math.PI*180; back[id][id][id][id][id]._rotation = t0; back[id][id][id][id]._xscale *= lemt; t0 = Math.atan2(vy1.x, vy1.y)/Math.PI*180; back[id][id][id][id]._rotation = t0-Math.atan2(h.x, h.y)/Math.PI*180; vy1.rotate(t0); vy2.rotate(t0); /*back[id].lineStyle(1,0xFF0000,100); back[id].moveTo(0,0); back[id].lineTo(vy1.x,vy1.y);*/ t1 = Math.sqrt(vx2.len2()/vy2.len2()); t2 = Math.sqrt(vx1.len2()/vy1.len2()); back[id][id][id]._xscale *= t1; back[id][id][id]._yscale *= t2; vy1.scale(t2); vy2.scale(t1); tv = vy2.minus(vy1); var t0 = Math.atan2(tv.x, tv.y)/Math.PI*180; back[id][id]._rotation = t0; vy1.rotate(t0); vy2.rotate(t0); tv.rotate(t0); back[id]._yscale *= (1/lemti); if (vi1.crosspro(vi2)>0) { t1 = 1; } else { t1 = -1; } if (vy1.crosspro(vy2)>0) { t2 = 1; } else { t2 = -1; } if (t1 != t2) { back[id]._yscale *= -1; } var h = new TVector(); h = tv.getCopy(); h.scale(-vy1.dotpro(tv)/tv.len2()); h = h.plus(vy1); back[id]._rotation = -(Math.atan2(hi.x, hi.y)-Math.atan2(h.x, h.y))/Math.PI*180; back[id][id][id][id][id]._visible = true; /*var ang:Number = Math.PI*0.499; var cos:Number = Math.cos(ang); var sin:Number = Math.sin(ang); var u = new TVector(cos, sin); var vt3 = new TVector(); vt3 = vt2.minus(vt1); var a:Number = vt1.dotpro(u)*cos; var e:Number = vt1.x-a; var b:Number = vt3.dotpro(u)*cos; var f:Number = vt2.x-vt1.x-b; var c:Number = vt1.dotpro(u)*sin; var g:Number = vt1.y-c; var d:Number = ((vt2.x-vt1.x)*cos+(vt2.y-vt1.y)*sin)*sin; var h:Number = vt2.y-vt1.y-d; var t1:Number = e*f+g*h-k*f*f-k*h*h; var t2:Number = e*b+a*f+g*d+c*h-2*k*b*f-2*k*h*d; var t3:Number = a*b+c*d-k*b*b-k*d*d; a = t1; b = t2; c = t3; if (b*b-4*a*c>0) { if (a<0) { a *= -1; b *= -1; c *= -1; } var lemt:Number = (-b+Math.sqrt(b*b-4*a*c))/(2*a); } else if (zero(b*b-4*a*c)) { var lemt:Number = (-b)/(2*a); } else { var lemt:Number = (-b+Math.sqrt(b*b-4*a*c))/(2*a); //trace(lemt); trace(a); trace(b); trace(c); trace("k= "+k); } back[id][id][id]._rotation = 90-ang/Math.PI*180; back[id][id]._xscale = lemt*100; var vy1 = new TVector(); var vh1 = u.getCopy(); vh1.scale(vt1.dotpro(u)); vh1.scale(1-lemt); vy1 = vt1.getCopy(); vy1.scale(lemt); vy1 = vy1.plus(vh1); var vy2 = new TVector(); vh1 = u.getCopy(); vh1.scale(vt2.dotpro(u)); vh1.scale(1-lemt); vy2 = vt2.getCopy(); vy2.scale(lemt); vy2 = vy2.plus(vh1); var vy3 = new TVector(); var vh2 = new TVector(); vy3 = vy2.minus(vy1); vh2 = vy3.getCopy(); vh2.scale(-vy1.dotpro(vy3)/vy3.len2()); vh2 = vh2.plus(vy1); back[id][id]._rotation = -90+ang/Math.PI*180; vh1 = vi3.getCopy(); vh1.scale(-.dotpro(vi3)/vi3.len2()); vh1 = vh1.plus(vi1); var fix:Number = Math.sqrt(vi3.len2()/vy3.len2()); back[id][id]._xscale *= fix; back[id][id]._yscale *= fix; back[id][id]._rotation += Math.atan2(vh2.x, vh2.y)/Math.PI*180; back[id]._yscale *= Math.sqrt(vh1.len2()/vh2.len2())/fix; back[id]._rotation = -Math.atan2(vh1.x, vh1.y)/Math.PI*180; if (vi1.crosspro(vi2)>0) { t1 = 1; } else { t1 = -1; } if (vy1.crosspro(vy2)>0) { t2 = 1; } else { t2 = -1; } if (t1 != t2) { back[id]._xscale *= -1; } back[id][id][id]._visible = 1;*/ } static function zero(x:Number):Boolean { if (Math.abs(x)<1e-5) { return true; } else { return false; } } public function rotate(x1:Number, y1:Number, z1:Number) { dir.rotate(x1, y1, z1); } }