确定线是否与CGRect相交 [英] Determine if line intersects CGRect

查看:158
本文介绍了确定线是否与CGRect相交的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我正在寻找类似这样的东西:

  CGPoint startLine = CGPointMake(5.0f,5.0f); 
CGPoint endLine = CGPointMake(25.0f,25.0f);

CGRect intersectingRect = CGRectMake(10.0f,10.0f,50.0f,50.0f);

if(CGRectContainsLine(intersectingRect,startLine,endLine)){// true
//线与矩形相交
}

解决方案

没有内置内容,但是应该这样做:

  BOOL RectContainsLine(CGRect r,CGPoint lineStart,CGPoint lineEnd)
{
BOOL(^ LineIntersectsLine)(CGPoint,CGPoint,CGPoint,CGPoint)= ^ BOOL (CGPoint line1Start,CGPoint line1End,CGPoint line2Start,CGPoint line2End)
{
CGFloat q =
//线条起始行之间的距离乘以line2的水平长度
(line1Start.y - line2Start.y)*(line2End.x - line2Start.x)
//线条起始列之间的距离乘以line2的垂直长度
- (line1Start.x - line2Start.x)*(line2End。 y - line2Start.y);
CGFloat d =
//第1行的水平长度乘以第2行的垂直长度
(line1End.x - line1Start.x)*(line2End.y - line2Start.y)
/ / Line 1的垂直长度乘以第2行的水平长度
- (line1End.y - line1Start.y)*(line2End.x - line2Start.x);

if(d == 0)
return NO;

CGFloat r = q / d;

q =
//线条起始行之间的距离乘以第1行的水平长度
(line1Start.y - line2Start.y)*(line1End.x - line1Start.x)
//线条起始列之间的距离乘以第1行的垂直长度
- (line1Start.x - line2Start.x)*(line1End.y - line1Start.y);

CGFloat s = q / d;
if(r <0 || r> 1 || s <0 || s> 1)
return NO;

返回YES;
};

/ *测试该线是否与以下任何一个相交:
* - 矩形的底部边缘
* - 矩形的右边缘
* - 顶部矩形的边缘
* - 矩形的左边缘
* - 矩形的内部(两个点都在里面)
* /

return(LineIntersectsLine lineStart,lineEnd,CGPointMake(r.origin.x,r.origin.y),CGPointMake(r.origin.x + r.size.width,r.origin.y))||
LineIntersectsLine(lineStart, lineEnd,CGPointMake(r.origin.x + r.size.width,r.origin.y),CGPointMake(r.origin.x + r.size.width,r.origin.y + r.size.height)) ||
LineIntersectsLine(lineStart,lineEnd,CGPointMake(r.origin.x + r.size.width,r.origin.y + r.size.height),CGPointMake(r.origin.x,r.origin .y + r.size.height))||
LineIntersectsLine(lineStart,lineEnd,CGPointMake(r.origin.x,r.origin.y + r.size.height),CGPointMake(r.origin.x ,r.origin.y))||
(CGRectC ontainsPoint(r,lineStart)&& CGRectContainsPoint(r,lineEnd)));
}

从这个问题中移出:如何知道一条线是否与矩形相交


What is the most efficient way to determine if a line intersects a rectangle?

I'm looking for something similar to this:

CGPoint startLine = CGPointMake(5.0f,5.0f);
CGPoint endLine = CGPointMake(25.0f,25.0f);

CGRect intersectingRect = CGRectMake(10.0f,10.0f,50.0f,50.0f);

if (CGRectContainsLine(intersectingRect,startLine,endLine)) { //true
    //line intersects rectangle
}

解决方案

There's nothing built in, but this ought to do it:

BOOL RectContainsLine(CGRect r, CGPoint lineStart, CGPoint lineEnd)
{
    BOOL (^LineIntersectsLine)(CGPoint, CGPoint, CGPoint, CGPoint) = ^BOOL(CGPoint line1Start, CGPoint line1End, CGPoint line2Start, CGPoint line2End)
    {
        CGFloat q =
            //Distance between the lines' starting rows times line2's horizontal length
            (line1Start.y - line2Start.y) * (line2End.x - line2Start.x)
            //Distance between the lines' starting columns times line2's vertical length
            - (line1Start.x - line2Start.x) * (line2End.y - line2Start.y);
        CGFloat d =
            //Line 1's horizontal length times line 2's vertical length
            (line1End.x - line1Start.x) * (line2End.y - line2Start.y)
            //Line 1's vertical length times line 2's horizontal length
            - (line1End.y - line1Start.y) * (line2End.x - line2Start.x);

        if( d == 0 )
            return NO;

        CGFloat r = q / d;

        q =
            //Distance between the lines' starting rows times line 1's horizontal length
            (line1Start.y - line2Start.y) * (line1End.x - line1Start.x)
            //Distance between the lines' starting columns times line 1's vertical length
            - (line1Start.x - line2Start.x) * (line1End.y - line1Start.y);

        CGFloat s = q / d;
        if( r < 0 || r > 1 || s < 0 || s > 1 )
            return NO;

        return YES;
    };

    /*Test whether the line intersects any of:
     *- the bottom edge of the rectangle
     *- the right edge of the rectangle
     *- the top edge of the rectangle
     *- the left edge of the rectangle
     *- the interior of the rectangle (both points inside)
     */

    return (LineIntersectsLine(lineStart, lineEnd, CGPointMake(r.origin.x, r.origin.y), CGPointMake(r.origin.x + r.size.width, r.origin.y)) ||
            LineIntersectsLine(lineStart, lineEnd, CGPointMake(r.origin.x + r.size.width, r.origin.y), CGPointMake(r.origin.x + r.size.width, r.origin.y + r.size.height)) ||
            LineIntersectsLine(lineStart, lineEnd, CGPointMake(r.origin.x + r.size.width, r.origin.y + r.size.height), CGPointMake(r.origin.x, r.origin.y + r.size.height)) ||
            LineIntersectsLine(lineStart, lineEnd, CGPointMake(r.origin.x, r.origin.y + r.size.height), CGPointMake(r.origin.x, r.origin.y)) ||
            (CGRectContainsPoint(r, lineStart) && CGRectContainsPoint(r, lineEnd)));
}

Trivially ported from this question: How to know if a line intersects a rectangle

这篇关于确定线是否与CGRect相交的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆