As3 带箭头直线的不同画法

来源:互联网 发布:闪铸fdm打印机 知乎 编辑:程序博客网 时间:2024/04/29 11:20

1:使用Math.cos、Math.sin组合画线


代码:

       //一般画带箭头直线

              function drawArrowWithVector(g:Graphics,x1:int,y1:int,x2:int,y2:int):void {

                     //箭头长度

                     var len:int = 10;

                     //箭头与直线的夹角

                     var _a:int = 30;

                     var angle:int = Math.atan2((y1-y2), (x1-x2))*(180/Math.PI);

                     //angle = Degree.fixAngle(angle);

                     g.lineStyle(lineWidth,0xff5566);

                     g.moveTo(x2,y2);

                     g.lineTo(x2+len*Math.cos((angle-_a)*(Math.PI/180)), y2+len*Math.sin((angle-_a)*(Math.PI/180)));

                     g.moveTo(x2,y2);

                     g.lineTo(x2+len*Math.cos((angle+_a)*(Math.PI/180)), y2+len*Math.sin((angle+_a)*(Math.PI/180)));

                     g.moveTo(x1,y1);

                     g.lineTo(x2,y2);   

              }

   说明:该方法比第一种方法的灵活性要好出很多,不管节点怎么变化都可以准确的画出你想要的内容。具体用法:

                     var sp:Sprite=new Sprite()

                     var v1:Point=new Point(100,200);

                     var v2:Point=new Point(350,150);

                     drawArrowWithVector(sp.graphics,v1.x,v1.y,v2.x,v2.y);

                     this.addChild(sp);



2:使用Point.polar和Point.offset方法画线

   代码:

       //使用极坐标画线

              private function drawArrowWithPolar(_g:Graphics,fP:Point,tP:Point):void{

                     var arrowBaseSize:Number = 10;//箭头两边距离中间线的距离

                     var arrowHeadLength:Number = 50;//箭头的长度


                     var lArrowBase:Point;

                     var rArrowBase:Point;

                     var mArrowBase:Point;


                     var edgeAngle:Number= Math.atan2(tP.y - fP.y,tP.x - fP.x);

                     mArrowBase = Point.polar(Point.distance(tP,fP) - arrowHeadLength,edgeAngle);

                     mArrowBase.offset(fP.x,fP.y);

                     lArrowBase = Point.polar(arrowBaseSize,(edgeAngle - (Math.PI / 2.0)));

                     rArrowBase = Point.polar(arrowBaseSize,(edgeAngle + (Math.PI / 2.0)));


                     lArrowBase.offset(mArrowBase.x,mArrowBase.y);                 

                     rArrowBase.offset(mArrowBase.x,mArrowBase.y);


                     /* now we actually draw */

                     //_g.beginFill(0xff5566);

                     _g.lineStyle(lineWidth,0xff5566);

                     _g.moveTo(fP.x, fP.y);

                     _g.lineTo(tP.x, tP.y);

                     _g.lineTo(lArrowBase.x, lArrowBase.y);

                     //_g.moveTo(tP.x,tP.y);

                     _g.lineTo(rArrowBase.x, rArrowBase.y);

                     _g.lineTo(tP.x, tP.y);

                     //_g.endFill();

              }

       使用方法:

              var sp:Sprite=new Sprite()

                     var v1:Point=new Point(100,200);

                     var v3:Point=new Point(100,200);

                     var v4:Point=new Point(350,350);

                     drawArrowWithPolar(sp.graphics,v3,v4);

                     this.addChild(sp);

       说明:个人觉得这个方法很有意思,有兴趣的朋友可以试着改变arrowBaseSize和arrowHeadLength的,看看具体的不同。