2つのRectangleが重なる領域のRectangleを求める - C#

2つのRectangleが重なる領域のRectangleを求めるコードを紹介します。

概要

こちらの記事では2つのRectangleが重なるかを判定するコードを紹介しました。 Rectangleの重なりだけではなく、重なっている領域のRectangleの値も取得したいことがあります。 この記事では、2つのRectangleの重なる領域のRectangleを取得するコードを紹介します。
Rectangleの重なる領域を取得する場合は、Intersect()メソッドを利用します。

書式

[重なる領域のRectangleオブジェクト] = Rectangle.Intersect([Rectangleオブジェクト1],[Rectangleオブジェクト2])
Rectangleオブジェクト1とRectangleオブジェクト2の重なる領域の値が、Intersectメソッドの戻り値の[重なる領域のRectangleオブジェクト]に返ります。

プログラム

UI

下図のUIを作成します。フォームにLabelを1つ配置します。

コード

以下のコードを記述します。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace RectangleIntersection
{
  public partial class FormIntersectRect : Form
  {
    Rectangle[] rect;
    Point sp = new Point();
    int target=0;
    bool MouseDownFlag = false;
    Rectangle OldBand = new Rectangle(0,0,0,0);
    private Rectangle intersectRect;

    public FormIntersectRect()
    {
      InitializeComponent();
      rect = new Rectangle[2];
      for (int i=0; i<rect.Length; i++){
        rect[i] = new Rectangle();
      }
    }

    private void FormIntersectRect_Load(object sender, EventArgs e)
    {

    }

    private void FormIntersectRect_MouseDown(object sender, MouseEventArgs e)
    {
      sp.X = e.X;
      sp.Y = e.Y;
      MouseDownFlag = true;
    }

    private void FormIntersectRect_MouseMove(object sender, MouseEventArgs e)
    {
      if (MouseDownFlag == true) {
        Point ScreenP = this.PointToScreen(sp);

        ControlPaint.DrawReversibleFrame(OldBand, Color.White, FrameStyle.Dashed);

        Rectangle r = new Rectangle(ScreenP.X, ScreenP.Y, e.X - sp.X, e.Y - sp.Y);
        ControlPaint.DrawReversibleFrame(r, Color.White, FrameStyle.Dashed);
        OldBand = new Rectangle(ScreenP.X, ScreenP.Y, e.X - sp.X, e.Y - sp.Y);

      }
    }


    private void FormIntersectRect_MouseUp(object sender, MouseEventArgs e)
    {
      rect[target].X = sp.X;
      rect[target].Y = sp.Y;
      rect[target].Width = e.X - sp.X;
      rect[target].Height = e.Y - sp.Y;

      if (target == 0) {
        target = 1;
      }
      else {
        target = 0;
      }
      MouseDownFlag = false;
      OldBand = new Rectangle(0, 0, 0, 0);
      this.Invalidate();

      intersectRect = Rectangle.Intersect(rect[0], rect[1]);
      if (intersectRect.IsEmpty == true) {
        label1.Text = "矩形は重なっていません。";
      }
      else {
        label1.Text = "矩形は重なっています。";
      }
    }

    private void FormIntersectRect_Paint(object sender, PaintEventArgs e)
    {
      e.Graphics.DrawRectangle(new Pen(Color.Blue), rect[0]);
      e.Graphics.DrawRectangle(new Pen(Color.Red), rect[1]);
      e.Graphics.FillRectangle(new SolidBrush(Color.Orange), intersectRect);
    }
  }
}

解説

コードの大部分はこちらの記事で紹介されているコードと同じです。
重なっている領域のRectangleはIntersect()メソッドの戻り値で取得できます。
Intersect()メソッドを用いた場合、重なる部分の有無の判定は、戻り値のRectangleオブジェクトに対してIsEmptyプロパティの値を調べます。IsEmptyプロパティがtrueであれば、重なっている領域は無いことが確認できます。

実行結果

プロジェクトを実行します。下図のウィンドウが表示されます。


フォーム上でドラッグします。ラバーバンドが表示されます。


ドラッグを完了すると矩形が描画されます。


もう一度ドラッグします。ラバーバンドが表示されます。先の矩形と重なるようにドラッグします。


ドラッグを完了すると矩形が描画されます。重なっている部分がオレンジで塗りつぶされます。


矩形の大きさや形を変更しても重なっている部分がオレンジで塗りつぶされます。


このページのキーワード
  • 2つのRectangleが重なる領域のRectangleを取得する
著者
iPentecのメインプログラマー
C#, ASP.NET の開発がメイン、少し前まではDelphiを愛用
掲載日: 2014-10-27
iPentec all rights reserverd.