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