2011-01-27 20 views
13

Jak mogę odjąć jeden CGRect od innego? Chcę, aby wynik R1 - R2 był największym podprostokątem R1, który nie przecina R2.Odejmij CGRect od CGRect - największy fragment niezawierający innego

Przykład 1:

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

CGRectSubstract R3 = (R 2, R 1);

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

Przykład 2:

CGRectSubstract R3 = (R 2, R 1);

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

Przykład 3:

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

CGRectSubstract R3 = (R 2, R 1);

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



+2

Co oznaczałoby to odjąć prostokąta z innego prostokąta? –

+0

Sprawdź mój przykład. R2 może być wszędzie. – anonymous

Odpowiedz

20

Twoja definicja jest dość niejednoznaczne, co mówi, czy odejmowanie jest poziome lub pionowe? Polecam użycie kombinacji CGRectIntersection i CGRectDivide, wraz z określeniem kierunku usuwania niejednoznaczności.

(nie testowane, lub nawet skompilowany)

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

Dzięki, spróbuję ... – anonymous

+0

@cobbal: rock ... to powinno zadziałać ... Sprawdzę to. Ostatecznie mam i że chcę od ostatnich pięciu dni ... :) – Nit

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

W odpowiedzi na rysunku, ten kod Dałem wam tutaj zrobi dokładnie to, co chcesz (zakładając, że nie dbają o pochodzeniu współrzędne XY). Przeanalizowałem numer docs for CGGeometry functions i nie wydaje się, aby była zdefiniowana CGRectDifference lub inna taka metoda. Istnieje jednak CGRectUnion, ale jest to przeciwieństwo tego, czego szukasz.

+0

Już sprawdzam funkcje CGGeometry. Mamy GRectUnion i CGRectIntersection. Ale to nie jest to, czego potrzebuję. – anonymous

+0

Tak, to też był mój wniosek. Po prostu użyj kodu, który ci podałem, aby zrobić nowy rect i powinien zrobić to, czego potrzebujesz, ponownie zakładając, że nie dbasz o współrzędne początku. Możesz nawet nazwać to CGRectDifference! =) –

+0

Potrzebuję odpowiednich współrzędnych i odpowiedniego rozmiaru dla R3. Domyślam się, że twój przykład nie jest poprawny w stosunku do tego, czego potrzebuję. – anonymous

0

prawdopodobnie tam coś takiego:

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' oraz' frame.size.width' to 'CGFloat', a nie' CGRect'. Może Typo? Dlaczego odejmujesz szerokość od wysokości? Nie jestem pewien, co tutaj robisz ... –

+0

Tak, przepraszam, literówka, to tylko przykład. – WrightsCS

+0

Ahh Widzę teraz. "Sall dobry. =) –

Powiązane problemy