16

どうすればCGRect別のものから減算できますか? R1 - R2結果を、R2 と交差しない R1 の最大のサブ長方形にしたいと考えています。

例 1 :

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

R3 = CGRectSubstract(R2,R1);

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

例 2 :

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

R3 = CGRectSubstract(R2,R1);

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

例 3 :

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

R3 = CGRectSubstract(R2,R1);

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



4

3 に答える 3

20

あなたの定義はかなりあいまいですが、引き算が水平か垂直かを何と言っていますか? 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;
}
于 2011-01-27T00:58:39.163 に答える
1
CGRect newRect = CGRectMake(0, 0, rect2.size.width - rect1.size.width, rect2.size.height - rect1.size.height);

あなたのイラストに応えて、私がここであなたに与えたこのコードは、あなたが望むことを正確に行います(原点のXY座標を気にしないと仮定して). CGGeometry functionsのドキュメントを調べましたが、CGRectDifferenceそのようなメソッドが定義されていないようです。ただし、ありますが、CGRectUnionそれはあなたが探しているものとは逆です。

于 2011-01-27T00:10:09.570 に答える
-1

おそらく次のようなものになるでしょう:

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);
于 2011-01-27T00:15:40.467 に答える