2011-01-27 10 views
13

¿Cómo puedo restar un CGRect de otro? Quiero que el resultado R1 - R2 sea la subrectangle más grande de R1 que no se cruza con R2.Restar CGRect de CGRect - pieza más grande de uno que no contiene el otro

Ejemplo 1:

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

R3 = CGRectSubstract (R2, R1);

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

Ejemplo 2:

R3 = CGRectSubstract (R2, R1);

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

Ejemplo 3:

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

R3 = CGRectSubstract (R2, R1);

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



+2

¿Qué significaría para restar un rectángulo de otro rectángulo? –

+0

Verifique mi ejemplo. R2 podría estar en cualquier lado. – anonymous

Respuesta

20

Su definición es bastante ambigua, lo que dice si la sustracción es horizontal o vertical? Recomiendo usar una combinación de CGRectIntersection y CGRectDivide, junto con especificar una dirección para eliminar la ambigüedad.

(no probado, o incluso compilado)

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; 
} 
+0

Gracias, lo intentaré ... – anonymous

+0

@cobbal: tu rock ... debe funcionar ... voy a comprobar eso ... por fin tengo y que quiero desde los últimos cinco días ... :) – Nit

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

En respuesta a su ilustración, el código que le he dado aquí va a hacer exactamente lo que quiere (suponiendo que no se preocupan por el origen de coordenadas XY). Miré a través del docs for CGGeometry functions, y no parece haber un CGRectDifference u otro método definido. Sin embargo, hay CGRectUnion, pero eso hace lo contrario de lo que está buscando.

+0

Ya compruebo las funciones de CGGeometry. Tenemos GRectUnion y CGRectIntersection. Pero no es lo que necesito. – anonymous

+0

Sí, esa fue mi conclusión también. Simplemente usa el código que te di para hacer tu nuevo rect y debería hacer lo que necesites, asumiendo nuevamente que no te importan las coordenadas de origen. ¡Incluso podría llamarlo CGRectDifference! =) –

+0

Necesito las coordenadas correctas y el tamaño correcto para R3. Supongo que tu ejemplo no es correcto para lo que necesito. – anonymous

0

probablemente vaya algo como esto:

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); 
+0

'frame.size.height' y' frame.size.width' es un 'CGFloat', no un' CGRect'. Typo, tal vez? Además, ¿por qué restas ancho y alto? No estoy seguro de lo que está haciendo aquí ... –

+0

Sí, lo siento, error tipográfico, es solo un ejemplo. – WrightsCS

+0

Ahh ahora veo. 'Todo está bien. =) –

Cuestiones relacionadas