springgraph

  1. package controls   
  2. {   
  3.     import com.adobe.flex.extras.controls.springgraph.Graph;   
  4.     import com.adobe.flex.extras.controls.springgraph.IEdgeRenderer;   
  5.     import com.adobe.flex.extras.controls.springgraph.Item;   
  6.        
  7.     import flash.display.BitmapData;   
  8.     import flash.display.Graphics;   
  9.     import flash.geom.Matrix;   
  10.     import flash.text.TextFieldAutoSize;   
  11.        
  12.     import mx.core.IDataRenderer;   
  13.     import mx.core.UIComponent;   
  14.     import mx.core.UITextField;   
  15.     import mx.graphics.ImageSnapshot;   
  16.   
  17.     public class CusEdge implements IEdgeRenderer   
  18.     {   
  19.         private var thickness:int=2;   
  20.         private var lineColor:uint=0x232323;   
  21.         private var arrowSize:int=5;   
  22.            
  23.         public function CusEdge()   
  24.         {   
  25.         }   
  26.            
  27.         /** 实现画线接口 **/   
  28.         public function draw(g:Graphics, fromView:UIComponent, toView:UIComponent, fX:int, fY:int, tX:int, tY:int, graph:Graph):Boolean   
  29.         {   
  30.             var fromItem: Item = (fromView as IDataRenderer).data as Item;   
  31.             var toItem: Item = (toView as IDataRenderer).data as Item;   
  32.             var node:Object=graph.getLinkData(fromItem,toItem);   
  33.             if (node.@fromID!=(fromView as CusNode).id && node.@fromID==(toView as CusNode).id)   
  34.             {   
  35.                 return drawNew(g,toView,fromView,tX,tY,fX,fY,graph);   
  36.             }      
  37.             else   
  38.             {   
  39.                 return drawNew(g,fromView,toView,fX,fY,tX,tY,graph);   
  40.             }   
  41.             return true;   
  42.         }   
  43.            
  44.         /** 画线函数 **/   
  45.         public function drawNew(g:Graphics, fromView:UIComponent, toView:UIComponent, fX:int, fY:int, tX:int, tY:int, graph:Graph):Boolean   
  46.         {   
  47.             var fromX:int;   
  48.             var fromY:int;   
  49.             var toX:int;   
  50.             var toY:int;   
  51.             var totoX:int;   
  52.             var totoY:int;   
  53.             var eid:String;   
  54.                
  55.             var halfFromH:Number=fromView.height/2;   
  56.             var halfFromW:Number=fromView.width/2;   
  57.             var halfToH:Number=toView.height/2;   
  58.             var halfToW:Number=toView.width/2;   
  59.                
  60.             var angle:Number  = getAngle( fX, fY, tX, tY);             
  61.             var toAngle:Number=Math.atan2(halfToH,halfToW)*(180/Math.PI);   
  62.             var fromAngle:Number=Math.atan2(halfFromH,halfFromW)*(180/Math.PI);   
  63.             var k:Number=Math.tan(angle*(Math.PI/180));   
  64.                
  65.             ///to坐标换算   
  66.             if (angle>=0 && angle<90)//1象限   
  67.             {   
  68.                 if (angle>toAngle)   
  69.                 {   
  70.                     toX=tX - halfToH / k;   
  71.                     toY=tY + halfToH;                  
  72.                 }   
  73.                 else   
  74.                 {   
  75.                     toX=tX - halfToW;   
  76.                     toY=tY + halfToW * k;   
  77.                 }   
  78.             }   
  79.             if (angle>=90 && angle<=180)//2象限   
  80.             {   
  81.                 if (angle+toAngle>180)   
  82.                 {   
  83.                     toX=tX + halfToW ;   
  84.                     toY=tY - halfToW * k;                  
  85.                 }   
  86.                 else   
  87.                 {   
  88.                     toX=tX - halfToH / k;   
  89.                     toY=tY + halfToH;      
  90.                 }   
  91.             }   
  92.             if (angle>=-90 && angle<0)//4象限   
  93.             {   
  94.                 if (Math.abs(angle)>toAngle)   
  95.                 {   
  96.                     toX=tX + halfToH / k;                      
  97.                     toY=tY - halfToH;                  
  98.                 }   
  99.                 else   
  100.                 {   
  101.                     toX=tX - halfToW;   
  102.                     toY=tY + halfToW * k;   
  103.                 }   
  104.             }   
  105.             if (angle<-90 && angle>=-180)//3象限   
  106.             {   
  107.                 if (angle+180>toAngle)   
  108.                 {   
  109.                     toX=tX + halfToH / k;   
  110.                     toY=tY - halfToH;                  
  111.                 }   
  112.                 else   
  113.                 {   
  114.                     toX=tX + halfToW;   
  115.                     toY=tY - halfToW * k;      
  116.                 }   
  117.             }   
  118.             ///from坐标换算   
  119.             if (angle>0 && angle<=90)   
  120.             {              
  121.                 if (angle>fromAngle)   
  122.                 {   
  123.                     fromX=fX + halfFromH / k;   
  124.                     fromY=fY - halfFromH;   
  125.                 }   
  126.                 else   
  127.                 {   
  128.                     fromX=fX + halfFromW;   
  129.                     fromY=fY - halfFromW * k;   
  130.                 }   
  131.             }   
  132.             if (angle>90 && angle<=180)   
  133.             {   
  134.                 if (angle+fromAngle>180)   
  135.                 {   
  136.                     fromX=fX - halfFromW;   
  137.                     fromY=fY + halfFromW * k;              
  138.                 }   
  139.                 else   
  140.                 {   
  141.                     fromX=fX + halfFromH / k;   
  142.                     fromY=fY - halfFromH;   
  143.                 }   
  144.             }   
  145.             if (angle>=-90 && angle<=0)   
  146.             {   
  147.                 if (Math.abs(angle)>fromAngle)   
  148.                 {   
  149.                     fromX=fX - halfFromH / k;   
  150.                     fromY=fY + halfFromH;   
  151.                 }   
  152.                 else   
  153.                 {   
  154.                     fromX=fX + halfFromW;   
  155.                     fromY=fY - halfFromW * k;   
  156.                 }   
  157.             }   
  158.             if (angle<-90 && angle>=-180)   
  159.             {   
  160.                 if (angle+180>fromAngle)   
  161.                 {   
  162.                     fromX=fX - halfFromH / k;   
  163.                     fromY=fY + halfFromH;   
  164.                 }   
  165.                 else   
  166.                 {   
  167.                     fromX=fX - halfFromW;   
  168.                     fromY=fY + halfFromW * k;   
  169.                 }   
  170.             }   
  171.                
  172.                
  173.                
  174.             totoX=toX - arrowSize * Math.cos(angle*(Math.PI/180));   
  175.             totoY=toY + arrowSize * Math.sin(angle*(Math.PI/180));   
  176.                
  177.             g.lineStyle(thickness,lineColor);   
  178.             g.moveTo(fromX,fromY);             
  179.             g.lineTo(totoX,totoY);   
  180.   
  181.                
  182.             var fromItem: Item = (fromView as IDataRenderer).data as Item;   
  183.             var toItem: Item = (toView as IDataRenderer).data as Item;   
  184.             var node:Object=graph.getLinkData(fromItem,toItem);   
  185.             if (node!=null)   
  186.             {   
  187.                 if (node.@id)              
  188.                     eid=node.@prop;   
  189. //              if (node.width)   
  190. //                  weight=node.width;   
  191. //              if (node.bytewidth)   
  192. //                  bytewidth=node.bytewidth;   
  193.             }   
  194.             var uit:UITextField = new UITextField();   
  195.             uit.textColor = lineColor;   
  196.             uit.text = eid;   
  197.             uit.autoSize =   TextFieldAutoSize.LEFT;   
  198.             var textBitmapData:BitmapData = ImageSnapshot.captureBitmapData(uit);   
  199.             var sizeMatrix:Matrix = new Matrix();   
  200.             var coef:Number = Math.min(uit.measuredWidth/textBitmapData.width,uit.measuredHeight/textBitmapData.height);   
  201.             sizeMatrix.a = coef;   
  202.             sizeMatrix.d = coef;   
  203.             textBitmapData = ImageSnapshot.captureBitmapData(uit,sizeMatrix);   
  204.             g.lineStyle(0,0,0);   
  205.             var sm:Matrix = new Matrix();   
  206.             sm.tx = (fromX+toX)/2;   
  207.             sm.ty = (fromY+toY)/2;   
  208.             g.beginBitmapFill(textBitmapData,sm,false);   
  209.             g.drawRect((fromX+toX)/2,(fromY+toY)/2,uit.measuredWidth,uit.measuredHeight);   
  210.             g.endFill();   
  211.                
  212.                
  213.             drawArrowHead(fromX,fromY,toX,toY,g);   
  214.             return true;   
  215.         }   
  216.            
  217.         /** 画箭头 **/   
  218.         private function drawArrowHead(startX:int,startY:int,endX:int,endY:int,graphics:Graphics):void{   
  219.             //得到箭头的角度   
  220.             var angle:Number  = this.getAngle(startX,startY,endX,endY);   
  221.             var centerX:Number = endX - arrowSize * Math.cos(angle*(Math.PI/180));   
  222.             var centerY:Number = endY + arrowSize * Math.sin(angle*(Math.PI/180));   
  223.                
  224.             var leftX:Number = centerX + arrowSize * Math.cos((angle+120)*(Math.PI/180));   
  225.             var leftY:Number = centerY - arrowSize * Math.sin((angle+120)*(Math.PI/180));   
  226.             var rightX:Number = centerX + arrowSize * Math.cos((angle+240)*(Math.PI/180));   
  227.             var rightY:Number = centerY - arrowSize * Math.sin((angle+240)*(Math.PI/180));    
  228.                
  229.             graphics.lineStyle(2,lineColor,1);   
  230.             graphics.beginFill(lineColor);   
  231.             graphics.moveTo(endX,endY);   
  232.                
  233.             graphics.lineTo(leftX,leftY);   
  234.             graphics.lineTo(centerX,centerY);   
  235.                
  236.             graphics.lineTo(rightX,rightY);   
  237.             graphics.lineTo(endX,endY);   
  238.             graphics.endFill();   
  239.         }   
  240.            
  241.         /** 得到箭头的角度 **/   
  242.         private function getAngle(startX:int,startY:int,endX:int,endY:int):Number{   
  243.             var temX:Number = endX - startX;   
  244.             var temY:Number = startY - endY;   
  245.             var angle:Number = Math.atan2(temY,temX)*(180/Math.PI);   
  246.             return angle;   
  247.         }   
  248.     }   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值