FLEX 相交线交点位置画弧线
发布时间:2020-12-15 03:46:09 所属栏目:百科 来源:网络整理
导读:功能描述: 两条线相交的位置画弧线过渡 截图: 代码: LineIntersect.mxml ?xml version="1.0" encoding="utf-8"?s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/
功能描述: 两条线相交的位置画弧线过渡 截图: 代码: LineIntersect.mxml
<?xml version="1.0" encoding="utf-8"?> <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:s="library://ns.adobe.com/flex/spark" xmlns:mx="library://ns.adobe.com/flex/mx" minWidth="955" minHeight="600" creationComplete="application1_creationCompleteHandler(event)" xmlns:component="com.askmewhat.component.*"> <fx:Script> <![CDATA[ import com.askmewhat.component.HLine; import com.askmewhat.helper.DrawerInfo; import mx.events.FlexEvent; private var isdraw:Boolean = false; private var startpoint:Point; private var endpoint:Point; private var drawComponet:HLine; // 折点半径 private var radius:Number = 8; private var drawerinfo:DrawerInfo = new DrawerInfo(); protected function start_draw(event:MouseEvent):void { isdraw = true; // 参数初始化 startpoint = new Point(event.localX,event.localY); drawComponet = new HLine(); //添加到画布 mainbc.addElement(drawComponet); } protected function end_draw(event:MouseEvent):void { isdraw = false; //绘制完成添加到已绘制列表 drawerinfo.lines.push({"s":startpoint,"e":endpoint}); } protected function drawing(event:MouseEvent):void { if(isdraw){ endpoint = new Point(event.localX,event.localY); drawComponet.radius = radius; drawComponet.startpoint = startpoint; drawComponet.endpoint = endpoint; drawComponet.drawerinfo = drawerinfo; drawComponet.draw(); } } protected function application1_creationCompleteHandler(event:FlexEvent):void { mainbc.addEventListener(MouseEvent.MOUSE_DOWN,start_draw); mainbc.addEventListener(MouseEvent.MOUSE_UP,end_draw); mainbc.addEventListener(MouseEvent.MOUSE_MOVE,drawing); } ]]> </fx:Script> <fx:Declarations> <!-- 将非可视元素(例如服务、值对象)放在此处 --> </fx:Declarations> <s:HGroup width="100%" height="100%"> <s:BorderContainer id="mainbc" width="100%" height="100%" backgroundColor="#ffffff" backgroundAlpha=".1"/> </s:HGroup> </s:Application> HUIComponent.as
package com.askmewhat.component { import com.askmewhat.helper.DrawerInfo; import mx.core.UIComponent; public class HUIComponent extends UIComponent { public var drawerinfo:DrawerInfo; public function HUIComponent() { super(); } } } HLine.as
package com.askmewhat.component { import com.askmewhat.vo.IntersectPointInfo; import flash.geom.Point; import mx.charts.chartClasses.GraphicsUtilities; public class HLine extends HUIComponent { public var startpoint:Point; public var endpoint:Point; // 折点半径 public var radius:Number = 8; public function HLine() { super(); } public function draw():void{ var intersectPointsInfoArray : Array = findIntersectPoint(); var intersectPointInfo:IntersectPointInfo; this.graphics.lineStyle(1,0x0000ff,1); //清空画布 this.graphics.clear(); // 设置线条样式 this.graphics.lineStyle(1,0xff0000,0.5); // 起始点 this.graphics.moveTo(startpoint.x,startpoint.y); if(intersectPointsInfoArray && intersectPointsInfoArray.length>0){ for(var i:int=0,j:int=intersectPointsInfoArray.length; i<j;i++){ intersectPointInfo = intersectPointsInfoArray[i] as IntersectPointInfo; var intersectPoint:Point = intersectPointInfo.intersectPoint; // 计算线段和水平线的相交角度 var angle:Number = calAngle(startpoint,intersectPoint,new Point(intersectPoint.x+100,intersectPoint.y)); // 计算第一个转折点 var p1:Point = new Point(intersectPoint.x + radius* Math.cos(angle),intersectPoint.y-radius*Math.sin(angle)); // 第一个转折点 this.graphics.lineTo(p1.x,p1.y); // 画弧线 GraphicsUtilities.drawArc(this.graphics,intersectPoint.x,intersectPoint.y,angle,Math.PI,radius,true); } } // 终点 this.graphics.lineTo(endpoint.x,endpoint.y); } /** * 获取正在绘制的线段和已绘制的线段相交点集合和线段集合 */ private function findIntersectPoint():Array { var intersectPointsInfoArray:Array = new Array(); var lines:Array = this.drawerinfo.lines; for (var i:int = 0; i < lines.length; i++) { var tempS:Point = lines[i]["s"] as Point; var tempE:Point = lines[i]["e"] as Point; var intersectPoint:Point = lineIntersectLine(startpoint,endpoint,tempS,tempE,true); if(intersectPoint){ var info:IntersectPointInfo = new IntersectPointInfo(); info.intersectPoint = intersectPoint; info.intersectLine = lines[i]; intersectPointsInfoArray.push(info); } } //相对于起始点,根据距离对相交点由近及远重新排序 var rtnArray:Array = new Array(); intersectPointsInfoArray.sort(compareFunction); function compareFunction(a:IntersectPointInfo,b:IntersectPointInfo):Number{ var pointa:Point = a.intersectPoint; var pointb:Point = b.intersectPoint; var distancea:Number = Math.sqrt(Math.pow((startpoint.x - pointa.x),2)+Math.pow((startpoint.y - pointa.y),2)); var distanceb:Number = Math.sqrt(Math.pow((startpoint.x - pointb.x),2)+Math.pow((startpoint.y - pointb.y),2)); if(distancea>distanceb) return 1; else if (distancea<distanceb) return -1; else return 0; } return intersectPointsInfoArray; } /** * 获取相交点 * A:线段一的起点 * B:线段一的终点 * E:线段二的起点 * F:线段二的终点 * as_seg:是否获取线段延长线的相交点(true 不判断, false 判断) */ private function lineIntersectLine(A:Point,B:Point,E:Point,F:Point,as_seg:Boolean=true):Point { var ip:Point; var a1:Number; var a2:Number; var b1:Number; var b2:Number; var c1:Number; var c2:Number; a1= B.y-A.y; b1= A.x-B.x; c1= B.x*A.y - A.x*B.y; a2= F.y-E.y; b2= E.x-F.x; c2= F.x*E.y - E.x*F.y; var denom:Number=a1*b2 - a2*b1; if (denom == 0) { return null; } ip=new Point(); ip.x=(b1*c2 - b2*c1)/denom; ip.y=(a2*c1 - a1*c2)/denom; //--------------------------------------------------- //Do checks to see if intersection to endpoints //distance is longer than actual Segments. //Return null if it is with any. //--------------------------------------------------- if(as_seg){ if(Math.pow(ip.x - B.x,2) + Math.pow(ip.y - B.y,2) > Math.pow(A.x - B.x,2) + Math.pow(A.y - B.y,2)) { return null; } if(Math.pow(ip.x - A.x,2) + Math.pow(ip.y - A.y,2)) { return null; } if(Math.pow(ip.x - F.x,2) + Math.pow(ip.y - F.y,2) > Math.pow(E.x - F.x,2) + Math.pow(E.y - F.y,2)) { return null; } if(Math.pow(ip.x - E.x,2) + Math.pow(ip.y - E.y,2)) { return null; } } return ip; } /** * 计算两条线的角度 */ private function calAngle(A:Point,F:Point):Number { var angleRadians:Number=Math.atan2(B.y-A.y,B.x-A.x)-Math.atan2(F.y-E.y,F.x-E.x); angleRadians = angleRadians>0 ? Math.PI - angleRadians : -(Math.PI + angleRadians); return angleRadians; } } } IntersectPointInfo.as
package com.askmewhat.vo { import flash.geom.Point; public class IntersectPointInfo { public var intersectPoint:Point public var intersectLine:Object public function IntersectPointInfo() { } } } DrawerInfo.as
package com.askmewhat.helper { public class DrawerInfo { public var lines:Array = new Array(); public function DrawerInfo() { } } } 源码下载地址: http://download.csdn.net/detail/askmewhat/7289975 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |