检查CGRect是否包含在另一个(转换的)rect中

时间:2014-04-23 14:50:23

标签: ios objective-c computational-geometry cgaffinetransform

我正在实施裁剪功能,并且我试图弄清楚如何测试裁剪矩形是否完全包含在变换后的图像视图中。即图像的裁剪部分应该没有空格。

我已经尝试复制此组件中实现的行为:https://github.com/heitorfr/ios-image-editor,它实现了类似的检查(见下文),但我无法让它适用于我的情况。

- (void)checkBoundsWithTransform:(CGAffineTransform)transform
{
    CGRect r1 = [self boundingBoxForRect:self.preview.cropRect 
                        rotatedByRadians:[self imageRotation]];
    Rectangle r2 = [self applyTransform:transform 
                                 toRect:self.preview.initialImageFrame];

    CGAffineTransform t = 
     CGAffineTransformMakeTranslation(CGRectGetMidX(self.preview.cropRect), 
                                      CGRectGetMidY(self.preview.cropRect));
    t = CGAffineTransformRotate(t, -[self imageRotation]);
    t = CGAffineTransformTranslate(t, 
                                   -CGRectGetMidX(self.preview.cropRect), -
                                   CGRectGetMidY(self.preview.cropRect));

    Rectangle r3 = [self applyTransform:t toRectangle:r2];

    if(CGRectContainsRect([self CGRectFromRectangle:r3],r1)) {
        self.validTransform = transform;
    }
}

1 个答案:

答案 0 :(得分:1)

不是最高性能的解决方案,但非常快速和肮脏。

NSBezierPath *path = [NSBezierPath bezierPathWithRect:r2];
[path transformUsingAffineTransform:t];
if([path containsPoint:NSMinX(r1)] 
    && [path containsPoint:NSMinY(r1)] 
    && [path containsPoint:NSMaxX(r1)] 
    && [path containsPoint:(NSMaxY(r1)] ){
    self.validTransform = transform;
}