Вычтите CGRect из CGRect наибольшей части одного, не содержащего другого

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

Пример 1:

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

R3 = CGRectSubtract(R2,R1);

            +----------------------+
            |                      |
            |                      |
            |                      |
            |          R3          |
            |                      |
            |                      |
            |                      |
            +----------------------+

Пример 2:

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

R3 = CGRectSubtract(R2,R1);

+-----------------------+
|                       |
|                       |
|                       |
|          R3           |
|                       |
|                       |
|                       |
+-----------------------+

Пример 3:

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

R3 = CGRectSubtract(R2,R1);

+----------------------------------+
|                                  |
|                                  |
|              R3                  |
|                                  |
+----------------------------------+




person anonymous    schedule 27.01.2011    source источник
comment
Что значит вычесть прямоугольник из другого прямоугольника?   -  person Oliver Charlesworth    schedule 27.01.2011
comment
Проверьте мой пример. R2 может быть где угодно.   -  person anonymous    schedule 27.01.2011


Ответы (3)


Ваше определение довольно двусмысленно, что говорит о том, является ли вычитание горизонтальным или вертикальным? Я рекомендую использовать комбинацию CGRectIntersection и CGRectDivide вместе с указанием направления для устранения двусмысленности.

(не проверено и даже не скомпилировано)

CGRect rectSubtract(CGRect r1, CGRect r2, CGRectEdge edge) {
    // Find how much r1 overlaps r2
    CGRect intersection = CGRectIntersection(r1, r2);

    // If they don't intersect, just return r1. No subtraction to be done
    if (CGRectIsNull(intersection)) {
        return r1;
    }

    // Figure out how much we chop off r1
    float chopAmount = (edge == CGRectMinXEdge || edge == CGRectMaxXEdge)
                       ? intersection.size.width
                       : intersection.size.height;

    CGRect r3, throwaway;
    // Chop
    CGRectDivide(r1, &throwaway, &r3, chopAmount, edge);
    return r3;
}
person cobbal    schedule 27.01.2011
comment
@cobbal: ты молодец.. это должно работать... я проверю это.. наконец-то я получил и то, что я хочу за последние пять дней... :) - person Nitin; 09.04.2012

CGRect newRect = CGRectMake(0, 0, rect2.size.width - rect1.size.width, rect2.size.height - rect1.size.height);

В ответ на вашу иллюстрацию этот код, который я вам здесь дал, будет делать именно то, что вы хотите (при условии, что вас не волнуют исходные координаты XY). Я просмотрел документы для функций CGGeometry., и, похоже, не определен CGRectDifference или другой подобный метод. Однако есть CGRectUnion, но он делает противоположное тому, что вы ищете.

person Marc W    schedule 27.01.2011
comment
Я уже проверяю функции CGGeometry. У нас есть GRectUnion и CGRectIntersection. Но это не то, что мне нужно. - person anonymous; 27.01.2011
comment
Да, это тоже был мой вывод. Просто используйте код, который я дал вам, чтобы создать новый прямоугольник, и он должен делать то, что вам нужно, опять же при условии, что вам не нужны исходные координаты. Вы могли бы даже назвать его CGRectDifference! знак равно - person Marc W; 27.01.2011
comment
Мне нужны правильные координаты и правильный размер для R3. Я думаю, ваш пример не подходит для того, что мне нужно. - person anonymous; 27.01.2011

Вероятно, будет что-то вроде этого:

CGRect frame = CGRectMake(0, 0, 320, 480);
float aWidth  = frame.size.width; /* say for instance 320 */
float aHeight = frame.size.height; /* say for instance 480 */

int final = aWidth - aHeight;
NSLog(@"Should be -160, your answer: %i",final);
person WrightsCS    schedule 27.01.2011
comment
frame.size.height и frame.size.width это CGFloat, а не CGRect. Опечатка, наверное? Кроме того, почему вы вычитаете ширину из высоты? Не знаю, что ты здесь делаешь... - person Marc W; 27.01.2011
comment
Да, извините, опечатка, это просто пример. - person WrightsCS; 27.01.2011