【问题标题】:Subtract CGRect from CGRect -- largest piece of one not containing the other从 CGRect 中减去 CGRect - 最大的一块不包含另一个
【发布时间】:2011-01-27 00:05:16
【问题描述】:

如何从另一个中减去一个 CGRect?我希望结果 R1 - R2 是 R1 中不与 R2 相交的最大子矩形。

示例 1

+---------------------------------+ | +--------+ | | | R2 | | | | | | | +--------+ R1 | | | | | | | +---------------------------------+

R3 = CGRectSubstract(R2,R1);

+------------------------+ | | | | | | | R3 | | | | | | | +------------------------+

示例 2

+------------------------+----------+ | | | | | R2 | | | | | R1 +----------+ | | | | | | +---------------------------------+

R3 = CGRectSubstract(R2,R1);

+------------------------+ | | | | | | | R3 | | | | | | | +------------------------+

示例 3

+---------------------------------+ | | | | | | | R1 | | +---------+ | | | | | | | R2 | | +---------+---------+--------------+

R3 = CGRectSubstract(R2,R1);

+---------------------------------+ | | | | | R3 | | | +---------------------------------+

【问题讨论】:

  • 从另一个矩形中减去一个矩形是什么意思?
  • 检查我的例子。 R2 可以在任何地方。

标签: objective-c geometry core-graphics cgrect


【解决方案1】:

您的定义相当模糊,减法是水平的还是垂直的?我建议使用 CGRectIntersection 和 CGRectDivide 的组合,并指定一个方向来消除歧义。

(未经测试,甚至未编译)

CGRect rectSubtract(CGRect r1, CGRect r2, CGRectEdge edge) {
    // Find how much r1 overlaps r2
    CGRect intersection = CGRectIntersection(r1, r2);

    // If they don't intersect, just return r1. No subtraction to be done
    if (CGRectIsNull(intersection)) {
        return r1;
    }

    // Figure out how much we chop off r1
    float chopAmount = (edge == CGRectMinXEdge || edge == CGRectMaxXEdge)
                       ? intersection.size.width
                       : intersection.size.height;

    CGRect r3, throwaway;
    // Chop
    CGRectDivide(r1, &throwaway, &r3, chopAmount, edge);
    return r3;
}

【讨论】:

  • @cobbal:你摇滚..它应该可以工作...我会检查一下..最后我得到了,我从过去五天开始想要......:)
【解决方案2】:
CGRect newRect = CGRectMake(0, 0, rect2.size.width - rect1.size.width, rect2.size.height - rect1.size.height);

根据您的说明,我在这里给您的这段代码将完全满足您的要求(假设您不关心原点 XY 坐标)。我查看了docs for CGGeometry functions,似乎没有定义CGRectDifference 或其他此类方法。但是,有 CGRectUnion,但这与您正在寻找的相反。

【讨论】:

  • 我已经检查了 CGGeometry 函数。我们有 GRectUnion 和 CGRectIntersection。但这不是我需要的。
  • 是的,这也是我的结论。只需使用我给你的代码来制作你的新矩形,它应该做你需要的,再次假设你不关心原点坐标。您甚至可以将其命名为 CGRectDifference! =)
  • 我需要 R3 的正确坐标和正确大小。我猜你的例子不符合我的需要。
【解决方案3】:

大概会这样:

CGRect frame = CGRectMake(0, 0, 320, 480);
float aWidth  = frame.size.width; /* say for instance 320 */
float aHeight = frame.size.height; /* say for instance 480 */

int final = aWidth - aHeight;
NSLog(@"Should be -160, your answer: %i",final);

【讨论】:

  • frame.size.heightframe.size.widthCGFloat,而不是 CGRect。错字,也许?另外,为什么要从高度中减去宽度?不知道你在这里做什么......
  • 是的,对不起,错字,这只是一个例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多