package { import flash.display.Sprite; import flash.events.MouseEvent; import flash.events.Event; import flash.display.Graphics; import flash.ui.MouseCursor; import flash.ui.Mouse; public class ShowCurve extends Sprite { private var isStop:Boolean; public function ShowCurve():void { init(); } private function init():void { stage.addEventListener(MouseEvent.MOUSE_DOWN,MouseDownHandler); addEventListener(Event.ENTER_FRAME,EnterFrameHandler); isStop = false; Mouse.cursor = MouseCursor.BUTTON; } private function MouseDownHandler(e:MouseEvent):void { if (!isStop){ removeEventListener(Event.ENTER_FRAME,EnterFrameHandler); isStop = true; } else{ addEventListener(Event.ENTER_FRAME,EnterFrameHandler); isStop = false; } } private function EnterFrameHandler(e:Event):void { graphics.clear(); var numPoints:uint=9; //先对点初始化 var points:Array = new Array(); for (var i:int = 0; i < numPoints; i++) { points[i] = new Object(); points[i].x=stage.stageWidth*Math.random(); points[i].y=stage.stageHeight*Math.random(); graphics.lineStyle(2,0xff0000,1); graphics.drawCircle(points[i].x,points[i].y,1);//为了更直观,把这几个点都圈标出来 } var _X_BEGIN:Number = (points[0].x + points[1].x) / 2; var _Y_BEGIN:Number = (points[0].y + points[1].y) / 2; graphics.lineStyle(1,0x00ff00,1); graphics.drawCircle(_X_BEGIN,_Y_BEGIN,1); //为了看得更清楚,把新加的点,用蓝色标出来 for (i = 1; i < numPoints - 2; i ++) { var _xc:Number = (points[i].x + points[i + 1].x) / 2; var _yc:Number = (points[i].y + points[i + 1].y) / 2; graphics.lineStyle(3,0x0000ff,1); graphics.drawCircle(_xc,_yc,1); } graphics.lineStyle(1); //先把画笔移到第一个辅助点 graphics.moveTo(_X_BEGIN, _Y_BEGIN); //去掉首尾二点后,根据剩下的点和新加的点画曲线 for (i = 1; i < numPoints - 2; i ++) { var xc:Number = (points[i].x + points[i + 1].x) / 2; var yc:Number = (points[i].y + points[i + 1].y) / 2; graphics.curveTo(points[i].x, points[i].y, xc, yc); } var _len:uint=points.length; //倒数第二个绿点 var _X_END_1:Number = (points[_len-2].x + points[_len-1].x)/2; var _Y_END_1:Number = (points[_len-2].y + points[_len-1].y)/2; //最后一个绿点 var _X_END_2:Number = (points[_len-1].x + points[0].x)/2; var _Y_END_2:Number = (points[_len-1].y + points[0].y)/2; //最后一个蓝点为起点,到_X_END_1,_Y_END_1,倒数第二个红点为控制点 graphics.curveTo(points[i].x, points[i].y, _X_END_1,_Y_END_1); graphics.curveTo(points[_len-1].x, points[_len-1].y, _X_END_2,_Y_END_2); graphics.curveTo(points[0].x, points[0].y, _X_BEGIN,_Y_BEGIN); graphics.lineStyle(1,0x00ff00,1); graphics.drawCircle(_X_END_1,_Y_END_1,1); graphics.drawCircle(_X_END_2,_Y_END_2,1); } } }