CGPathGetBoundingBox的奇怪行为

时间:2014-10-11 10:14:08

标签: cocoa core-graphics

这个非常简单的代码......

CGPathRef path = CGPathCreateWithEllipseInRect(CGRectMake(-50, -50, 100, 100), NULL);
NSLog(@"Original path bounds = %@", NSStringFromRect(CGPathGetBoundingBox(path)));
CGAffineTransform t = CGAffineTransformMakeRotation(0.75 * M_PI);
CGPathRef tPath = CGPathCreateCopyByTransformingPath(path, &t);
NSLog(@"Transformed path bounds = %@", NSStringFromRect(CGPathGetBoundingBox(tPath)));
CGPathRelease(path);
CGPathRelease(tPath);

...产生以下奇怪的输出:

[...] Original path bounds = {{-50, -50}, {100, 100}}
[...] Transformed path bounds = {{-54.881553646890872, -54.881553646890872}, {109.76310729378174, 109.76310729378174}}

因为它是以(0,0)为中心的圆圈,所以不应该保留原始边界框的任何旋转吗?为什么地球上有边界框?或者它是苹果虫?

1 个答案:

答案 0 :(得分:2)

这里的问题是CGPathGetBoundingBox()函数包含用于构造圆的贝塞尔曲线的控制点。这些控制点位于圆圈之外,因此当您旋转圆圈时,它们自然会在原始边界框之外结束。

解决方案是使用CGPathGetPathBoundingBox()函数,该函数在计算路径边界框时不包含控制点。