确定线是否与CGRect相交

编程入门 行业动态 更新时间:2024-10-26 12:21:14
本文介绍了确定线是否与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 1 || 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相交

本文发布于:2023-05-26 09:48:33,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/252264.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:CGRect

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!