【问题标题】:Know the intersection point of two CGRect知道两个CGRect的交点
【发布时间】:2023-03-04 04:43:02
【问题描述】:

我正在编写游戏,我需要检测两个 CGRect 之间的交叉点。要做到这一点,我没有问题。我喜欢这样:

CGRect rect1 = CGRectMake (x1, y1, a1, b1);
CGRect rect2 = CGRectMake (x2, y2, a2, b2);
if (CGRectIntersectsRect(rect1, rect2))
{
    //do some stuff...
}

所以我没有问题。但是如果有可能从这两个 CGRect 中知道精确的交点,我会吗? 如果可能的话,怎么做?

谢谢!

【问题讨论】:

  • 交点到底是什么意思?正如@H2CO3 在 cmets 中指出的那样,您将有 两个 交点。我将把它留给更正式的数学头脑来决定两个只有一个共同点的矩形是否可以说是相交的。
  • 我想从两个 CGRect 中得到一个近似的交点。
  • 您可能知道,数字计算机不倾向于做任何“近似”的事情,因此您需要更加具体。对我来说,这听起来像是你需要一个全新的问题,而不是在这个问题之上堆积一个新的规范。
  • 我知道计算机中没有近似值,但计算机语言的精确度可能是用户体验的近似值。有了速度,您就看不到交点是否高两个像素。这就是我所说的近似值。

标签: ios objective-c intersection detect cgrect


【解决方案1】:

使用CGRectIntersection() function 获取两个相交矩形的公共部分。根据该函数调用的结果,您可以使用CGRectGet[Max|Min][X|Y]() functions 计算矩形的边缘。

【讨论】:

  • 例如,我可以用 CGRectIntersectsRect() 函数检测交集,然后用 CGRectIntersection() 函数得到一个矩形。因此,例如,我可以将返回矩形的原点作为一个点,对吗?
  • @user2057209 可以,但是要注意两个原始矩形的相对位置。在交叉点的 4 个点中,只有两个是实际的交叉点。
  • "返回值:表示两个指定矩形相交的矩形。"所以我只有一个矩形可以使用,不是吗?
  • @user2057209 这个矩形有 4 个角,其中只有 2 个角是实际的交点。 (把它画在纸上,你会明白的。)
  • 啊,好吧,我正在考虑使用新矩形的原点来获得一个近似的交点。
【解决方案2】:

我想我正在尝试做和你一样的事情。我想获得两个矩形之间的特定重叠。我发现 CGRectUnion 非常有用,因为它给出了包含两个矩形的最小矩形。如果尺寸大于您的“最大”,那么您知道矩形与右侧或底部重叠。如果原点为负,则您知道矩形与顶部或左侧重叠。我编写了这个函数来给出纠正重叠所需的偏移量。

CGPoint GetOffsetBetweenFrames(CGRect maxBounds, CGRect frame)
{
    CGRect frameUnion = CGRectUnion(maxBounds, frame);

    CGPoint offset = CGPointZero;
    if (CGRectGetMinX(frameUnion) < 0)
        offset.x = -frameUnion.origin.x;
    else if (CGRectGetWidth(frameUnion) > CGRectGetWidth(maxBounds))
        offset.x = -(CGRectGetWidth(frameUnion) - CGRectGetWidth(maxBounds));

    if (CGRectGetMinY(frameUnion) < 0)
        offset.y = -frameUnion.origin.y;
    else if (CGRectGetHeight(frameUnion) > CGRectGetHeight(maxBounds))
        offset.y = -(CGRectGetHeight(frameUnion) - CGRectGetHeight(maxBounds));

    return offset;
}

哦,也可以快速编辑:应用偏移很简单:

offset = GetOffsetBetweenFrames(maxBounds, frame);
frame = CGRectOffset(frame, offset.x, offset.y);

【讨论】:

    猜你喜欢
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多