首先,从屏幕上通过鼠标画一个多变形,要求没有自相交的部分
接着,通过输入框输入外垂距A和内垂距B(输入线的距离为已输入的垂距),来生成与多变形平行的二多边形
接着,通过输入框输入外垂距A和内垂距B(输入线的距离为已输入的垂距),来生成与多变形平行的二多边形
解决方案
40
public partial class Form1 : Form { public Form1() { InitializeComponent(); } List<PointF> dat = new List<PointF>(); List<PointF> datA = new List<PointF>(); List<PointF> datB = new List<PointF>(); private void pictureBox1_Paint(object sender, PaintEventArgs e) { var g = e.Graphics; if (dat.Count > 2) { g.DrawPolygon(Pens.Black, dat.ToArray()); if (datA.Count > 2) g.DrawPolygon(Pens.Red, datA.ToArray()); if (datB.Count > 2) g.DrawPolygon(Pens.Green, datB.ToArray()); } else { foreach (var p in dat) { g.DrawArc(Pens.Black, new RectangleF(p.X - 2, p.Y - 2, 5, 5), 0, 360); } } } private void pictureBox1_MouseDown(object sender, MouseEventArgs e) { dat.Add(new Point(e.X, e.Y)); pictureBox1.Invalidate(); } private void button1_Click(object sender, EventArgs e) { var A = int.Parse("0" + textBox1.Text); var B = int.Parse("0" + textBox2.Text); if (A > 0) datA = Polygon(dat, A); if (B > 0) datB = Polygon(dat, -B); pictureBox1.Invalidate(); } List<PointF> Polygon(List<PointF> dat, double h) { var t = new List<Line>(); for (var i = 0; i < dat.Count - 1; i++) { if (i == 0) t.Add(new Line(dat[dat.Count - 1], dat[i]).ParallelLines(h)); t.Add(new Line(dat[i], dat[i + 1]).ParallelLines(h)); } var res = new List<PointF>(); for (var i = 0; i < t.Count - 1; i++) { if (i == 0) res.Add(t[t.Count - 1].Corss(t[i])); res.Add(t[i].Corss(t[i + 1])); } return res; } private void button2_Click(object sender, EventArgs e) { dat.Clear(); datA.Clear(); datB.Clear(); pictureBox1.Invalidate(); } } public class Line { public PointF Start; public PointF End; public PointF Increment; public float Slope; public Line(PointF s, PointF e) { Start = s; End = e; Increment = new PointF(End.X - Start.X, End.Y - Start.Y); Slope = Increment.Y / Increment.X; } public Line ParallelLines(double h) { var r = (float)(h / Math.Sin(Math.Atan2(Increment.Y, Increment.X))); return new Line( new PointF(Start.X + r - Increment.X, Start.Y - Increment.Y), new PointF(End.X + r + Increment.X, End.Y + Increment.Y)); } public PointF Corss(Line t) { if (Slope == t.Slope) return PointF.Empty; var x = (Slope * Start.X - t.Slope * t.Start.X - Start.Y + t.Start.Y) / (Slope - t.Slope); var y = Slope * x - Slope * Start.X + Start.Y; return new PointF(x, y); } }