最近挙動シリーズが多い気がしますが(^^;

Rectangle rc = new Rectangle(10, 10, 10, 10);
Debug.WriteLine(Rectangle.Union(rc, Rectangle.Empty));

出力結果:
{X=0,Y=0,Width=20,Height=20}

矩形の合成って結構頻繁にやると思うのですが、上のコードのようにEmptyとUnionしたとき、期待する結果になりません。
Emptyは矩形が何もないという意味合いで使いたいのですが、合成するとEmptyのLeft, Top, Right, Bottomも影響を与えてしまっています。

特にMFCのCRectの感覚で使っていると痛い目を見ます(CRectはEmptyと合成したときには、Emptyは合成結果に影響を与えない)。

なので、これを回避するには、以下のような処理をする必要があるかと思います。
(このコード実行してないので、うまく動かないかもしれませんが(^^;)

public static void Union(ref Rectangle rc1, Rectangle rc2)
{
    if (rc1.IsEmpty)
    {
        rc1 = rc2;
    }
    else if (!rc2.IsEmpty)
    {
        rc1 = Rectangle.Union(rc1, rc2);
    }
}

// 拡張メソッド版
public static Rectangle Union(this Rectangle rc1, Rectangle rc2)
{
    if (rc1.IsEmpty)
    {
        return rc2;
    }
    else if (!rc2.IsEmpty)
    {
        return Rectangle.Union(rc1, rc2);
    }
    return rc1;
}

記事検索

アーカイブ