играю с двумя CGRect

У меня есть два прямоугольника R1 и R2

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

R1 представляет самый большой, а R2 самый маленький. Я хотел бы отправить область, которая у нас есть, если мы вычтем R2 до R1, моему методу, который принимает прямоугольник в качестве входных данных. Это вообще возможно? Любая мера, чтобы избежать этого


person alka-hich    schedule 16.05.2016    source источник
comment
Я хотел бы отправить область, которая у нас есть, если мы вычтем R2 до R1, моему методу, который принимает прямоугольник в качестве входных данных. Вычесть R2 из R1? Хм!? прямоугольник в качестве ввода? У вас есть два прямоугольника.   -  person El Tomato    schedule 16.05.2016
comment
Вы не можете представить эту форму, используя x+y и w+h.   -  person trojanfoe    schedule 16.05.2016
comment
изобразить 3 прямоугольника и отправить их по одному?..   -  person alka-hich    schedule 16.05.2016
comment
Наверное. Вы можете отправить все одновременно, например, если используете массив.   -  person trojanfoe    schedule 16.05.2016
comment
Это ерунда... извините, что бесполезно, но вам нужно 8 точек... если вы хотите, чтобы площадь могла минус ширина x высота R2 от ширины x высота от R1... все еще не "прямоугольник" хотя   -  person Magoo    schedule 16.05.2016
comment
@Magoo Я понял это, но я больше ожидал альтернативного метода для получения этой области, я знаю, что не могу нарисовать прямоугольник с 8 точками   -  person alka-hich    schedule 16.05.2016
comment
Когда вы говорите, что вам нужна «площадь», вы имеете в виду, что вам нужна форма, представляющая? или общее количество пикселей, содержащихся в нем?   -  person Magoo    schedule 16.05.2016
comment
@trojanfoe спасибо за подсказку, ожидал большего ответа, подобного вашему, какие будут преимущества создания массива, зная, что я могу создать 3 общих @property (nonatomic, assign) CGRect grabRect; и использовать все, что отправит их один за другим, откуда я хочу в моей программе   -  person alka-hich    schedule 16.05.2016
comment
@Magoo Форма, чтобы я мог кормить свой метод захвата   -  person alka-hich    schedule 16.05.2016
comment
Он гораздо более лаконичен и автономен и не ограничен количеством предоставляемых вами свойств.   -  person trojanfoe    schedule 16.05.2016
comment
Всегда ли R2 находится в границах R1?   -  person laltin    schedule 16.05.2016
comment
@laltin Да, R2 всегда находится в пределах R1   -  person alka-hich    schedule 16.05.2016
comment
@alka-hich, в таком случае мой ответ должен сработать :)   -  person Magoo    schedule 16.05.2016


Ответы (2)


Найти площадь

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

Найти прямоугольники (при условии, что эти два прямоугольника работают с одними и теми же границами)

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);
}
person Magoo    schedule 16.05.2016

Я хотел бы отправить область, которая у нас есть, если мы вычтем R2 до R1, моему методу, который принимает прямоугольник в качестве входных данных. Это вообще возможно?

Нет, потому что область представлена ​​размером (CGSize), но ваш метод принимает в качестве входных данных прямоугольник (CGRect).

Но, возможно, когда вы говорите «площадь», вы на самом деле имеете в виду «форму»? Тогда вам придется рисовать или выводить форму самостоятельно. И опять же, в этом случае вы не можете отправить его методу, который «принимает прямоугольник в качестве входных данных», потому что теперь у вас будет путь (например, UIBezierPath или CGPath) или что-то еще рисунок (например, UIImage).

Таким образом, как видно из этого снимка экрана, сделать вырезанную прямоугольную форму несложно:

введите здесь описание изображения

...но информация, описывающая эту форму, не может быть представлена ​​просто как прямоугольник.

person matt    schedule 16.05.2016