加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读