判断线段和矩形是否相交

简介: package { import flash.display.Sprite; import flash.events.MouseEvent; import flash.text.TextField; [SWF(width=375,height=300,background...
package
{
	import flash.display.Sprite;
	import flash.events.MouseEvent;
	import flash.text.TextField;
 
	[SWF(width=375,height=300,backgroundColor="0xeeeeee")]
	public class RectLine extends Sprite
	{
		private var txt:TextField;
		public function RectLine()
		{
 
			this.txt = new TextField();
			addChild(txt);
 
			stage.addEventListener(MouseEvent.CLICK,ckHandler);
			ckHandler(null);
		}
 
		private function ckHandler(e:MouseEvent):void
		{
			graphics.clear();
			graphics.beginFill(0x00ffff);
			graphics.drawRect(100,100,200,50);
			graphics.endFill();
 
			var a:int = Math.random()*375;
			var b:int = Math.random()*300;
			var c:int = Math.random()*375;
			var d:int = Math.random()*300;
 
			graphics.lineStyle(2,0xff0000);
			graphics.moveTo(a,b);
			graphics.lineTo(c,d);
			trace(isLineIntersectRectangle(a,b,c,d,100,100,300,150));
			var isF:Boolean = isLineIntersectRectangle(a,b,c,d,100,100,300,150);
			txt.text = "是否相交:"+isF;
		}		
 
		/** <p>判断线段是否在矩形内 </p>
		 * 先看线段所在直线是否与矩形相交,  
		 * 如果不相交则返回false,  
		 * 如果相交,  
		 * 则看线段的两个点是否在矩形的同一边(即两点的x(y)坐标都比矩形的小x(y)坐标小,或者大),  
		 * 若在同一边则返回false,  
		 * 否则就是相交的情况。 
		 * @param linePointX1 线段起始点x坐标  
		 * @param linePointY1 线段起始点y坐标  
		 * @param linePointX2 线段结束点x坐标  
		 * @param linePointY2 线段结束点y坐标  
		 * @param rectangleLeftTopX 矩形左上点x坐标  
		 * @param rectangleLeftTopY 矩形左上点y坐标  
		 * @param rectangleRightBottomX 矩形右下点x坐标  
		 * @param rectangleRightBottomY 矩形右下点y坐标  
		 * @return 是否相交 
		 */
		private function isLineIntersectRectangle(linePointX1:Number,
												  linePointY1:Number,
												  linePointX2:Number,
												  linePointY2:Number,
												  rectangleLeftTopX:Number,
												  rectangleLeftTopY:Number,
												  rectangleRightBottomX:Number,
												  rectangleRightBottomY:Number):Boolean
		{ 
			var  lineHeight:Number = linePointY1 - linePointY2;
			var lineWidth:Number = linePointX2 - linePointX1;  // 计算叉乘  
			var c:Number = linePointX1 * linePointY2 - linePointX2 * linePointY1;
			if ((lineHeight * rectangleLeftTopX + lineWidth * rectangleLeftTopY + c >= 0 && lineHeight * rectangleRightBottomX + lineWidth * rectangleRightBottomY + c <= 0)    
				|| (lineHeight * rectangleLeftTopX + lineWidth * rectangleLeftTopY + c <= 0 && lineHeight * rectangleRightBottomX + lineWidth * rectangleRightBottomY + c >= 0)    
				|| (lineHeight * rectangleLeftTopX + lineWidth * rectangleRightBottomY + c >= 0 && lineHeight * rectangleRightBottomX + lineWidth * rectangleLeftTopY + c <= 0)    
				|| (lineHeight * rectangleLeftTopX + lineWidth * rectangleRightBottomY + c <= 0 && lineHeight * rectangleRightBottomX + lineWidth * rectangleLeftTopY + c >= 0)) 
			{ 
 
				if (rectangleLeftTopX > rectangleRightBottomX) {
					var temp:Number = rectangleLeftTopX;
					rectangleLeftTopX = rectangleRightBottomX;
					rectangleRightBottomX = temp;   
				}   
				if (rectangleLeftTopY < rectangleRightBottomY) {
					var temp1:Number = rectangleLeftTopY;    
					rectangleLeftTopY = rectangleRightBottomY;    
					rectangleRightBottomY = temp1;   }   
				if ((linePointX1 < rectangleLeftTopX && linePointX2 < rectangleLeftTopX)      
					|| (linePointX1 > rectangleRightBottomX && linePointX2 > rectangleRightBottomX)      
					|| (linePointY1 > rectangleLeftTopY && linePointY2 > rectangleLeftTopY)      
					|| (linePointY1 < rectangleRightBottomY && linePointY2 < rectangleRightBottomY)) {    
					return false;   
				} else {    
					return true;   
				}  
			} else {  
				return false;  
			} 
		}
	}
}

http://blog.sqstudio.com/as3/algorithm/842.html#codesyntax_1

目录
打赏
0
0
0
0
13
分享
相关文章
圆和矩形是否有重叠
圆和矩形是否有重叠
127 0
|
7月前
|
C++
已知线段上某点与起点的距离,求该点的坐标
已知线段上某点与起点的距离,求该点的坐标
58 1
|
7月前
|
平面中判断线段与矩形是否相交
平面中判断线段与矩形是否相交
104 0
空间射线与三角形相交算法的两种实现
空间射线与三角形相交算法的两种实现
71 0
判断线段是否相交
判断线段是否相交
116 0
判断点是否在线段上
判断点是否在线段上
199 0
给定三个顶点的坐标使用程序计算三角形
给定三个顶点的坐标使用程序计算三角形
113 0
平面上给定n条线段,找出一个点,使这个点到这n条线段的距离和最小。
题目:平面上给定n条线段,找出一个点,使这个点到这n条线段的距离和最小。 源码如下: 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 ...
1128 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等