如何判断线段是否经过一个矩形?(线段与矩形是否相交)

之前遇到一个数学问题,如何判断某一线段是否穿过封闭区域?由于很急,在网上胡乱找了一下解决方案,但是没有解决到实际问题。

已知:矩形的四个顶点,线段的起始点,

求:判断线段是否经过改矩形。(如图,红线穿过封闭区域,绿线不穿过封闭区域。)

 

 问题类似于 如何判断某一线段是否穿过封闭区域?  道理就是那个道理,我在那里拿的图。

由于时间关系,我就叫同事帮我写个通用方法,他略微思索,百度了一下,觉得用中学知识就可以解决这个问题,欣然就答应了。代码如下:

    public static bool IsPassThroughRect(List<Vector2> VectList, Vector2 begin, Vector2 end)
    {
        //求直线公式
        double k, b;
        k = (begin.y - end.y) / (begin.x - end.x);
        b = begin.y - begin.x * k;
        int count = 0;
        for (int i = 0; i < VectList.Count; i++)
        {
            if ((VectList[i].y - k * VectList[i].x - b) > 0)
                count++;
            else
                count--;
        }
        if (count == 4 || count == -4)
            return false;
        else
            return true;
    }

  他给我解释了一下:

    将直线写成y=kx+b的形式,将图形的所有顶点坐标带入y-kx-b。

    如果得到的结果同时大于零或者同时小于零,说明图形的所有顶点都在直线的同侧,即直线不过图形。否则说明图形的顶点分布在直线两侧,直线过图形。

    主要是思想就是中学知识:

(1)y-kx-b=0  点刚好在直线上。

(2)y-kx-b>0  点在直线上方。

(3)y-kx-b<0  点在直线下方。

我看了一下,好像是这个道理,直接将参数传进去,测试了一下,结果发现,这个道理虽然是这个道理,但是所用的知识是点与线的关系。这里的需求是线段与矩形的关系,如果是线段的话,这样是不满足需求的。

发现这个问题的时候,都十点半了,其他同事都下班了,看见主程还在,遂问了一下是否有类似的通用方法,结果真有!

代码如下:

 /// <summary>
    /// 线段与矩形是否相交
    /// </summary>
    /// <param name="linePointX1"></param>
    /// <param name="linePointY1"></param>
    /// <param name="linePointX2"></param>
    /// <param name="linePointY2"></param>
    /// <param name="rectangleLeftTopX"></param>
    /// <param name="rectangleLeftTopY"></param>
    /// <param name="rectangleRightBottomX"></param>
    /// <param name="rectangleRightBottomY"></param>
    /// <returns></returns>
    public static bool isLineIntersectRectangle(float linePointX1,
                                      float linePointY1,
                                    float linePointX2,
                                     float linePointY2,
                                     float rectangleLeftTopX,
                                      float rectangleLeftTopY,
                                      float rectangleRightBottomX,
                                      float rectangleRightBottomY)
    {
        float lineHeight = linePointY1 - linePointY2;
        float lineWidth = linePointX2 - linePointX1;  // 计算叉乘 
        float c = 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)
            {
                float temp = rectangleLeftTopX;
                rectangleLeftTopX = rectangleRightBottomX;
                rectangleRightBottomX = temp;
            }
            if (rectangleLeftTopY < rectangleRightBottomY)
            {
                float temp1 = 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;
        }

    }

他说他也是在网上扒下来的,我没细想,直接改成通用方法,传入我的参数,测试了几次,发现问题解决了。愉快下班!!!

今天发现(判断线段和矩形是否相交 )这篇文章好像就是原文,只是他是用JavaScript写的。大概就是扒的他了吧!

 

  • 13
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值