トップページに戻る    次のC#のサンプルへ    前のC#のサンプルへ

11-7 長方形の交わり判定

問題

2つの長方形があります。
左上隅のx座標、y座標、右下隅のx座標、y座標をそれぞれleft, top, right, bottomとします。
また、おのおのの長方形についてleft < right, top < bottom が成り立つものとします。
この2つの長方形が重なっているかどうかを判定するコードを書いてください。
なお辺で接する場合(例えば(0, 0, 100, 100)と(100, 0, 200, 100))は重なっていないものとします。


ソース(Rectangle構造体を使用せず)

using System;

class Program
{
    static int Left1, Top1, Right1, Bottom1;
    static int Left2, Top2, Right2, Bottom2;

    static void Main()
    {
        //case1
        Left1 = 0; Top1 = 0; Right1 = 100; Bottom1 = 100;
        Left2 = 100; Top2 = 0; Right2 = 200; Bottom2 = 100;
        Console.WriteLine("case1は、重なって" + (IsOverLap() ? "ます" : "ません"));

        //case2
        Left1 = 50; Top1 = 50; Right1 = 100; Bottom1 = 100;
        Left2 = 75; Top2 = 75; Right2 = 100; Bottom2 = 100;
        Console.WriteLine("case2は、重なって" + (IsOverLap() ? "ます" : "ません"));

        //case3
        Left1 = 50; Top1 = 50; Right1 = 100; Bottom1 = 100;
        Left2 = 75; Top2 = 900; Right2 = 100; Bottom2 = 999;
        Console.WriteLine("case3は、重なって" + (IsOverLap() ? "ます" : "ません"));
    }

    static bool IsOverLap()
    {
        if (Left2 < Right1 && Left1 < Right2) {
            if (Top2 < Bottom1 && Top1 < Bottom2) return true;
        }
        return false;
    }
}


ソース(Rectangle構造体を使用)

using System;
using System.Drawing;

class Program
{
    static void Main()
    {
        var rect1 = new Rectangle(0, 0, 100, 100);
        var rect2 = new Rectangle(100, 0, 200 - 100, 100);
        var rect3 = new Rectangle(50, 50, 100 - 50, 100 - 50);
        var rect4 = new Rectangle(75, 75, 100 - 75, 100 - 75);
        var rect5 = new Rectangle(75, 900, 100 - 75, 999 - 900);

        Console.WriteLine("case1は、重なって" + (rect1.IntersectsWith(rect2) ? "ます" : "ません"));
        Console.WriteLine("case2は、重なって" + (rect3.IntersectsWith(rect4) ? "ます" : "ません"));
        Console.WriteLine("case3は、重なって" + (rect3.IntersectsWith(rect5) ? "ます" : "ません"));
    }
}


実行結果

case1は、重なってません
case2は、重なってます
case3は、重なってません


解説

OverLaps述語は、
d1をコアタイム開始時間
d2をコアタイム終了時間
d3を出社時間
d4を退社時間
とおいて

d3 <= d2 and d1 <= d4
は、
今日のコアタイム終了前に、出社して (d3 <= d2)
今日のコアタイム開始後に、退社した (d1 <= d4)
ならば、
今日のコアタイムに存在したという発想で、
ほぼ代用できます。
OracleSQLパズル 10-226 OverLaps述語

しかし、Rectangle構造体を使ったほうがシンプルですね。
MSDN --- Rectangle構造体