[C#] 2つのRectangleで重なる部分の領域を求める

このページのタグ:[C#] [Rectangle]
2つのRectangleで重なる部分の領域を求めるコードを紹介します。

概要

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

プログラム

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であれば、重なっている領域は無いことが確認できます。

実行結果

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


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


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


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


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


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


登録日 :2014-10-27    最終更新日 :2014-12-09
このページのタグ:[C#] [Rectangle]
Japanese
プライバシー    iPentecについて
iPentec all rights reserverd. (ISDC)