有人可以解释 CGRectGetMaxX 和 CGRectIntersection 的结果吗?

Posted

技术标签:

【中文标题】有人可以解释 CGRectGetMaxX 和 CGRectIntersection 的结果吗?【英文标题】:Can someone explain the result of CGRectGetMaxX and CGRectIntersection? 【发布时间】:2014-09-19 16:28:42 【问题描述】:

场景

假设有两个不相交的矩形,宽 10 磅,高 5 磅。以下模式中的 x/y 值表示两个矩形角点的坐标。

x/y = 0/0 +------------------+ x/y = 9/0
          |                  |
          |                  |
          |                  |
          |                  |
x/y = 0/4 +------------------+ x/y = 9/4
x/y = 0/5 +------------------+ x/y = 9/5
          |                  |
          |                  |
          |                  |
          |                  |
x/y = 0/9 +------------------+ x/y = 9/9

以下是设置这些矩形的代码:

CGRect rect1 = CGRectMake(0.0f, 0.0f, 10.0f, 5.0f);
CGRect rect2 = CGRectMake(0.0f, 5.0f, 10.0f, 5.0f);

CGRectGetMaxX

CGRectGetMaxX Core Graphics 函数的返回值记录如下:

矩形 x 坐标的最大值。

这里是使用函数的代码sn-p:

CGFloat maxX = CGRectGetMaxX(rect1);

根据文档,我预计 maxX 是 9。但是,maxX 是 10。嗯?

CGRectIntersection

CGRectIntersection Core Graphics 函数的返回值记录如下:

表示两个指定矩形相交的矩形。如果两个矩形不相交,则返回空矩形。要检查这种情况,请使用 CGRectIsNull。

这里是使用函数的代码sn-p:

CGRect intersectionRect = CGRectIntersection(rect1, rect2);
bool intersectionRectIsNull = CGRectIsNull(intersectionRect);

根据文档,我希望 intersectionRectIsNull 是真的,因为 rect1rect2 显然不相交。但是,intersectionRectIsNull 是错误的。啊???

如果我们在调试器中检查intersectionRect,我们会看到:

(CGRect) $0 = origin=(x=0, y=5) size=(width=10, height=0)

是的,所以现在很清楚为什么 CGRectIsNull 返回 false,但到底为什么 intersectionRect 不是这个?

(CGRect) $0 = origin=(x=+Inf, y=+Inf) size=(width=0, height=0)

问题

有人能解释为什么这些函数的文档没有错吗?我一定是错过了什么,但我一辈子都看不到它是什么。

【问题讨论】:

【参考方案1】:

您的图表不正确。它与您的 CGRectMake 呼叫不匹配。

一个 10 宽、原点为 0 的矩形的最大 X 为 10,就像你得到的一样。

图表中的9 应为10,图表中的4 应为5

鉴于对CGRectMake 的两次调用,这两个矩形共享一个公共边。他们之间没有差距。

请记住,0 + 10 是 10,而不是 9,0 + 5 是 5,而不是 4。

【讨论】:

嗯? CGRectMake(0, 0, 10, 5) 说矩形是 10 点宽,从坐标 0 开始。所以第一个点在坐标 0,第二个点在坐标 1,第三个点在坐标 2,[...],第十个点在坐标 9。不是吗? @herzbube No. 宽度/高度不能用单个“点”表示,您需要有两个点来计算距离以确定这些测量值。像任何其他高度/宽度测量一样考虑它。从 0 英尺到 1 英尺的距离是 1 英尺,即使你说的是两个“点”。因此,在您的情况下,它是 10 点宽 - (0->1, 1->2, 2->3....9->10),即 10 个值。

以上是关于有人可以解释 CGRectGetMaxX 和 CGRectIntersection 的结果吗?的主要内容,如果未能解决你的问题,请参考以下文章

iOS开发CGRectGetMidX. CGRectGetMidY.CGRectGetMinY. CGRectGetMaxY. CGRectGetMinX. CGRectGetMaxX的使用(代码片段

iOS开发CGRectGetMidX. CGRectGetMidY.CGRectGetMinY. CGRectGetMaxY. CGRectGetMinX. CGRectGetMaxX的使用(代码片段

kafka学习

闭门沙龙招募:吃吃喝喝聊CG | 真格×量子位

有人可以解释在 C++ 中通过指针传递和通过引用传递的目的是啥吗?

有人可以解释为啥条件运算符和赋值运算符一起使用时表现奇怪吗?