zoukankan      html  css  js  c++  java
  • 判断线段和矩形是否相交

    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

  • 相关阅读:
    20145312 实验四《Andoid开发基础》
    20145312 《Java程序设计》第九周学习总结
    20145312 《Java程序设计》第八周学习总结
    20145312 实验三《敏捷开发与XP实践》
    20145312 《Java程序设计》第七周学习总结
    20145312 实验二《 Java面向对象程序设计》
    20145309李昊 信息安全系统设计基础第1周学习总结
    20145309《信息安全系统设计基础》第0周学习总结
    20145303课程总结
    20145215刘俊谦实验五 Java网络编程及安全
  • 原文地址:https://www.cnblogs.com/jiahuafu/p/4024661.html
Copyright © 2011-2022 走看看