package { import flash.display.Sprite; import flash.events.Event; import flash.geom.Point; public class Cosines extends Sprite { private var seg0:Segment; private var seg1:Segment; private var seg0Width:uint=80; private var seg1Width:uint=100; //用于保存上次自由端的dx,dy值 private var dxOld:Number=0; private var dyOld:Number=0; public function Cosines() { init(); } private function init():void { seg0=new Segment(seg0Width,10,0xff0000); addChild(seg0); seg1=new Segment(seg1Width,20,0x0000ff); addChild(seg1); seg1.x=stage.stageWidth/2; seg1.y=stage.stageHeight/2; addEventListener(Event.ENTER_FRAME, onEnterFrame); } private function onEnterFrame(event:Event):void { var dx:Number=mouseX-seg1.x; var dy:Number=mouseY-seg1.y; if (dx==dxOld&&dy==dyOld) { //trace("已经调整到位了!"); return;//直接返回,不作处理了 } dxOld=dx; dyOld=dy; //trace(dx,dy); var dist:Number=Math.sqrt(dx*dx+dy*dy); var a:Number=seg1Width; var b:Number=seg0Width; if (dist>=(a+b)) { //trace(dist,a+b); seg1.rotation=seg0.rotation=Math.atan2(dy,dx)*180/Math.PI; } else { var c:Number=Math.min(dist,a+b); var B:Number = Math.acos((b * b - a * a - c * c) / (-2 * a * c)); var C:Number = Math.acos((c * c - a * a - b * b) / (-2 * a * b)); var D:Number=Math.atan2(dy,dx); seg1.rotation = (D + B) * 180 / Math.PI; var E:Number=D+B+Math.PI+C; seg0.rotation=E*180/Math.PI; } seg0.x=seg1.getPin().x; seg0.y=seg1.getPin().y; } } }