为什么CGRectInfinite与CGRect之间存在差异,所有成员都设置为INFINITY?

时间:2014-08-05 09:25:19

标签: ios objective-c cgrect infinity

使用(无内容)SpriteKit节点时,我碰到了无限长方形

NSLog(@"%@", NSStringFromCGRect([node calculateAccumulatedFrame]));

输出

{{inf, inf}, {inf, inf}}

我想用CGRectIsInfinite来检查这个,但是测试失败了,这导致我尝试以下检查

CGRect rect = [node calculateAccumulatedFrame];
if (rect.origin.x == INFINITY && rect.origin.y == INFINITY && 
    rect.size.width == INFINITY && rect.size.height == INFINITY) {
    if (!CGRectIsInfinite(rect)) {
        NSLog(@"I don't get it");
    }
}

哪个输出:I don't get it,它现在整齐地总结了我的立场。

正如allestuetsmerweh在答案中指出的那样,函数确实对CGRectInfinite返回true,当我输出这个矩形时我得到了

{{-8.9884656743115785e+307, -8.9884656743115785e+307}, {1.7976931348623157e+308, 1.7976931348623157e+308}}

(尺寸均为DBL_MAX

CGRectInfinite背后的原因是一个矩形,其中一些值设置为DBL_MAX i.s.o.所有元素都设置为INFINITY的矩形? (虽然API确实返回CGRect,所有成员都设置为INFINITY) 或者更确切地说,为什么没有将元素设置为INFINITY的矩形注册为CGRectIsInfinite

2 个答案:

答案 0 :(得分:3)

CGRect r = CGRectInfinite;
NSLog(@"%i", CGRectIsInfinite(r)); //prints "1"

来自文档:

  

无限矩形是没有定义边界的矩形。可以创建无限矩形作为平铺滤波器的输出。例如,Core Image框架透视图块过滤器创建一个图像,其范围由无限矩形描述。

答案 1 :(得分:1)

  

CGRectInfinite背后的原因是一个矩形,其中一些值设置为DBL_MAX i.s.o.一个矩形,所有元素都设置为INFINITY?

以下是一些猜测:

  1. IEEE 754定义了两个无穷大(+∞和-∞)。必须选择一个(或CGRectInfinite)有不明确的值。
  2. Infinity不是真正的数字。转换为字符串进行序列化时,这可能会导致各种问题。
  3. 在C中使用无限值​​有点尴尬。
  4.   

    为什么没有将元素设置为INFINITY的矩形注册为CGRectIsInfinite?

    因为正如预期的那样,CGRectIsInfinite将其参数与CGRectInfinite进行比较(在某些API中具有特殊含义,因此应明确识别)。