Search code examples
objective-ccgrect

playing with two CGRect


I have two rectangle R1 and R2

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

R1 represents the biggest one, and R2 the smallest one. I would like to send the area that we have if we subtract R2 to R1 to my method that takes a rect as input. Is that even possible? Any measure to dodge that


Solution

  • Find area

    -(CGSize)areaOfRect:(CGRect)outerRect minusRect:(CGRect)innerRect
    {
        return (outerRect.size.width - innerRect.size.width) * (outerRect.size.height - innerRect.size.height);
    }
    

    Find rects (Assuming these two rects are working from the same bounds)

    typedef void(^RectCompletion)(CGRect topRect,CGRect leftRect,CGRect rightRect,CGRect bottomRect);
    
    
    -(void)rectsForRect:(CGRect)outerRect minusRect:(CGRect)innerRect withCompletion:(RectCompletion)completion
    {
        // First sanity..
        // You'll need to build up a list of prerequisite checks
    
        if (innerRect.origin.x < outerRect.origin.x)
            outerRect.origin.x = innerRect.origin.x;
    
        if (innerRect.origin.y < outerRect.origin.y)
            outerRect.origin.y = innerRect.origin.y;
    
        if (innerRect.origin.x + innerRect.size.width > outerRect.origin.x + outerRect.size.width)
            NSLog(@"Trim to edge");
    
        if (innerRect.origin.x > outerRect.origin.x + outerRect.size.width || innerRect.origin.y > outerRect.origin.y + outerRect.size.width)
            NSLog(@"Trim to edge");
    
        // etc...
    
    
        // Assuming the rect is always in bounds below should give you the 4 rects surrounding the inner rect.. 
    
        // With overlap..
    
        CGRect topRect = CGRectMake(outerRect.origin.x, outerRect.origin.y, outerRect.size.width, innerRect.origin.y);
        CGRect leftRect = CGRectMake(outerRect.origin.x, outerRect.origin.y, innerRect.origin.x, outerRect.size.height);
        CGRect rightRect = CGRectMake(innerRect.origin.x + innerRect.size.width, outerRect.origin.y, outerRect.size.width - (innerRect.origin.x + innerRect.size.width), outerRect.size.height);
        CGRect bottomRect = CGRectMake(outerRect.origin.x, outerRect.size.height - (innerRect.origin.y + innerRect.size.height), outerRect.size.width, outerRect.size.height - (innerRect.origin.y + innerRect.size.height));
    
    
        // No overlap
    
        CGRect topRect = CGRectMake(outerRect.origin.x, outerRect.origin.y, outerRect.size.width, innerRect.origin.y);
        CGRect leftRect = CGRectMake(outerRect.origin.x, innerRect.origin.y, innerRect.origin.x, innerRect.size.height);
        CGRect rightRect = CGRectMake(innerRect.origin.x + innerRect.size.width, innerRect.origin.y, outerRect.size.width - (innerRect.origin.x + innerRect.size.width), innerRect.size.height);
        CGRect bottomRect = CGRectMake(outerRect.origin.x, outerRect.size.height - (innerRect.origin.y + innerRect.size.height), outerRect.size.width, outerRect.size.height - (innerRect.origin.y + innerRect.size.height));
    
        completion(topRect,leftRect,rightRect,bottomRect);
    }