首页 > 代码库 > 判断线段和矩形是否相交

判断线段和矩形是否相交

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

判断线段和矩形是否相交