您的位置:首页 > 其它

判断线段和矩形是否相交

2014-10-14 16:22 316 查看
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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: