トップページに戻る
次の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構造体