5. 找出任意區塊間所有重疊區域之系統

using System.Drawing.Drawing2D;

namespace Q5
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button3_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            for (int i = 0; i < blocks.Count; i++)
            {
                Rectangle item = blocks[i];
                var pen = new Pen(
                    i == 0 ? Brushes.Red : i == 1 ? Brushes.Orange : i == 2 ? Brushes.Green : Brushes.Black
                    , 2);
                pen.DashStyle = i == 0 ? DashStyle.Solid : i == 1 ? DashStyle.Dot : i == 2 ? DashStyle.Dash : DashStyle.DashDotDot;
                e.Graphics.DrawRectangle(pen, item.X, 400 - item.Y - item.Height, item.Width, item.Height);
            }
        }

        private void panel2_Paint(object sender, PaintEventArgs e)
        {
            if (!show) return;
            for (int i = 0; i < blocks.Count; i++)
            {
                Rectangle item = blocks[i];
                var pen = new Pen(
                    i == 0 ? Brushes.Red : i == 1 ? Brushes.Orange : i == 2 ? Brushes.Green : Brushes.Black
                    , 2);
                pen.DashStyle = i == 0 ? DashStyle.Solid : i == 1 ? DashStyle.Dot : i == 2 ? DashStyle.Dash : DashStyle.DashDotDot;
                e.Graphics.DrawRectangle(pen, item.X, 400 - item.Y - item.Height, item.Width, item.Height);
            }

            var overlapped = new List<Rectangle>();
            foreach (var item in blocks)
            {
                foreach (var item1 in blocks)
                {
                    if (item == item1) continue;
                    if (!item.IntersectsWith(item1))
                    {
                        continue;
                    }
                    var t = new Rectangle(item.Location, item.Size);
                    t.Intersect(item1); // 沒說不准用 笑死
                    overlapped.Add(t);
                }
            }

            foreach (var item in overlapped)
            {
                e.Graphics.FillRectangle(Brushes.Red,
                    new Rectangle(item.X, 400 - item.Y - item.Height, item.Width, item.Height));
            }
        }

        List<Rectangle> blocks = new();
        bool show = false;
        Random rd = new Random();
        private void button1_Click(object sender, EventArgs e)
        {
            show = false;
            blocks.Clear();
            for (int i = 0, v = rd.Next(3) + 2; i < v; i++)
            {
                blocks.Add(new Rectangle(rd.Next(20, 81), rd.Next(20, 81), rd.Next(40, 201), rd.Next(40, 201)));
            }
            panel1.Refresh();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            show = true;
            panel2.Refresh();
        }
    }
}

Last updated