1. ±45°三點繞線系統

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

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

        List<Point> dots = new();
        private void button1_Click(object sender, EventArgs e)
        {
            dots.Clear();
            var rd = new Random();
            dots.Add(new Point(rd.Next(0, panel1.Width), rd.Next(0, panel1.Height)));
            dots.Add(new Point(rd.Next(0, panel1.Width), rd.Next(0, panel1.Height)));
            dots.Add(new Point(rd.Next(0, panel1.Width), rd.Next(0, panel1.Height)));
            xr = false;
            panel1.Refresh();
            b.Text = c.Text = "";
        }

        double dist(int x1, int y1, int x2, int y2)
        {
            return Math.Sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2));
        }

        private void panel1_Paint(object sender, PaintEventArgs e)
        {
            if (dots.Count == 0) return;
            foreach (var item in dots)
            {
                e.Graphics.FillEllipse(Brushes.Black, item.X - 5, item.Y - 5, 10, 10);
            }

            var dotsByY = dots.OrderBy(e => e.Y).ToList();
            var midY = dotsByY[1].Y;

            var xs = dots.Select(e => e.X).Order().ToList();

            a.Text = $"{xs[2] - xs[0] + dotsByY[2].Y - dotsByY[0].Y}";

            double sum = 0;
            bool drawL = false;
            var dotsByX = dots.OrderBy(e => e.X).ToList();
            var dot = dotsByX[0];
            if (xr && Math.Abs(dot.Y - midY) <= Math.Abs((dot.X) - dotsByX[1].X))
            {
                drawL = true;
                e.Graphics.DrawLine(new Pen(Brushes.Black, 2), dot.X, dot.Y,
                    dot.X + Math.Abs(midY - dot.Y), midY);
                sum += dist(dot.X, dot.Y,
                    dot.X + Math.Abs(midY - dot.Y), midY);
            }
            bool drawR = false;
            dot = dotsByX[2];
            if (xr && Math.Abs(dot.Y - midY) <= Math.Abs((dot.X) - dotsByX[1].X))
            {
                drawR = true;
                e.Graphics.DrawLine(new Pen(Brushes.Black, 2), dot.X, dot.Y,
                    dot.X - Math.Abs(midY - dot.Y), midY);
                sum += dist(dot.X, dot.Y,
                    dot.X - Math.Abs(midY - dot.Y), midY);
            }
            for (int i = 0; i < dotsByX.Count; i++)
            {
                Point item = dotsByX[i];
                if (!drawL && i == 0 || i == 1 || !drawR && i == 2)
                {
                    e.Graphics.DrawLine(new Pen(Brushes.Black, 2), item.X, item.Y, item.X, midY);
                    sum += Math.Abs(item.Y - midY);
                }
            }

            var allX = new List<int>();
            if (!drawL) allX.Add(dotsByX[0].X);
            else allX.Add(dotsByX[0].X + Math.Abs(midY - dotsByX[0].Y));
            allX.Add(dotsByX[1].X);
            if (!drawR) allX.Add(dotsByX[2].X);
            else allX.Add(dotsByX[2].X - Math.Abs(midY - dotsByX[2].Y));

            e.Graphics.DrawLine(new Pen(Brushes.Black, 2), allX.Min(), midY, allX.Max(), midY);
            sum += allX.Max() - allX.Min();

            b.Text = (int)sum + "";
            c.Text = $"{(1 - (double)(int)sum / int.Parse(a.Text))*100:f1}%";
        }

        bool xr = false;

        private void button2_Click_1(object sender, EventArgs e)
        {
            xr = true;
            panel1.Refresh();
        }
    }
}

Last updated