判断线段和矩形是否相交

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

时间: 2024-11-03 21:32:52

判断线段和矩形是否相交的相关文章

poj1410(判断线段和矩形是否相交)

题目链接:https://vjudge.net/problem/POJ-1410 题意:判断线段和矩形是否相交. 思路:注意这里的相交包括线段在矩形内,因此先判断线段与矩形的边是否相交,再判断线段的两端点是否在矩形内(因为是矩形,即凸多边形,直接用叉积判断即可,如果是一般的多边形,需要用射线法判断.) AC code: #include<cstdio> #include<algorithm> #include<cmath> #include<cstdlib>

poj 1410 Intersection (判断线段与矩形相交 判线段相交)

题目链接 Intersection Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12040   Accepted: 3125 Description You are to write a program that has to decide whether a given line segment intersects a given rectangle. An example: line: start point:

Intersection--poj1410(判断线段与矩形的关系)

http://poj.org/problem?id=1410 题目大意:给你一个线段和矩形的对角两点  如果相交就输出'T'  不想交就是'F' 注意: 1,给的矩形有可能不是左上 右下  所以要先判断的 2,线段在矩形的内部输出T 3,如果交点是矩形的顶点的话 是不相交的 情况有点多  刚开始考虑的太少   wa的我心疼 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<ctype.

C语言——结构体数组的使用案例(如何判断两个矩形是否相交,其中一个是否包含在另外一个里面,点是否在矩形中)

Rect.h struct CPoint { float x; float y; }; typedef struct CPoint CPoint; struct CSize { float width; float height; }; typedef struct CSize CSize; struct CRect { CPoint origin; CSize size; }; typedef struct CRect CRect; //判断两个矩形是否相交 BOOL isIntersecti

判断两个矩形是否相交

说矩形相交算法之前,先看下如何判断两条线段是否相交 如果有两条线段 [a, b],[c, d](a, b, c, d 为 X 轴坐标点),有下面两种不相交的情况:1)b < c 时,线段 [a, b] 在 [c, d] 的左边不相交2)d < a 时,线段 [a, b] 在 [c, d] 的右边不相交把上面两种情况取反就是相交的情况.相交的线段则可以表示为[min(a, c), min(b, d)](注意:min(b, d) 应大于 min(a, c),否则就是不相交了),即两条线段中起点大的

POJ 1410 判断线段与矩形交点或在矩形内

这个题目要注意的是:给出的矩形坐标不一定是按照左上,右下这个顺序的 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #define eps 1e-8 #define INF 1e9 using namespace std; const int maxn=100; typedef struct Point {

判断圆和矩形是否相交(非面积相交)

月赛题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=1165 题解. 问题很简单,给你一个矩形和一个圆,问你是否他们相交.注意,这里的相交不是面积相交.也就是说,圆在矩形内(且不相切)是不相交的.或者矩形在圆内(且矩形的四个点不在圆上)也是不相交的. 那么,我们怎么来判断呢? 中间轮廓线是矩形的边,各向外和内距离为圆半径r划线(当然,四个角的肯定不太标准). 如果圆心在红色区域的话,肯定是会与圆相交了... 当然,如果我们根本画不出来这

PHP判断两个矩形是否相交

<?php $s = is_rect_intersect(1,2,1,2,4,5,0,3); var_dump($s); /* 如果两个矩形相交,那么矩形A B的中心点和矩形的边长是有一定关系的. Case 2345中,两个中心点间的距离肯定小于AB边长和的一半. Case 1中就像等了. 设A[x01,y01,x02,y02]  B[x11,y11,x12,y12]. 矩形A和矩形B物理中心点X方向的距离为Lx:abs( (x01+x02)/2 – (x11+x12) /2) 矩形A和矩形B物

掩码内判断线段与哪些掩码相交

改进的Bresenham算法. 采用Bresenham算法进行直线计算,并且改进该算法中的乘法运算,使得整个直线段的计算都是通过加法运算进行,可以大大降低CPU的消耗,实验结果表明该算法对比DDA算法在频繁运算时能有者非常显著的效果.以下是改进过的Bresenham算法. 算法实现步骤: 过各行各列象素中心构造一组虚拟网格线.按直线从起点到终点的顺序计算直线与各垂直网格线的交点,然后确定该列象素中与此交点最近的象素.该算法的巧妙之处在于采用增量计算,使得对于每一列,只要检查一个误差项的符号,就可