C#:用鼠标画多边形,接着通过提交输入框内的值,生成与之平行的内外多边形

暂无_34692516 2016-09-13 02:18:59
首先,从屏幕上通过鼠标画一个多变形,要求没有自相交的部分
接着,通过输入框输入外垂距A和内垂距B(输入线的距离为已输入的垂距),来生成与多变形平行的二多边形

...全文
472 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xuzuning 2016-09-14
  • 打赏
  • 举报
回复
    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);
}
}
xinbada1985 2016-09-13
  • 打赏
  • 举报
回复
你这不已经把坐标都记载下来了吗!你在上网查一下算角度的!应该有很多
暂无_34692516 2016-09-13
  • 打赏
  • 举报
回复
目前,我是先新建了一个winform窗体应用程序,然后,添加了一个窗体Form1, 定义了全局变量

private Point startPoint;
private Graphics g;
Queue<Point> PointArray=new Queue<Point>();
写了三个事件 MouseDown
private void Form1_MouseDown(object sender,MouseEventArgs e)
{
startPoint=new Point(e.X,e.Y);
if(e.Button==MouseButtons.Left)
{
PointArray.Enqueue(new Point(e.X,e.Y));
}
}
MouseMove

private void Form1_MouseMove(object sender,MouseEventArgs e)
{
this.Text=string.Format("鼠标的位置({0},{1})",e.X,e.Y);
}
MouseUp
private void Form1_MouseUp(object sender,MouseEventArgs e)
{
g=this.CreateGraphics();
Pen p=new Pen(Color.Black,2);
g.DrawLine(p,startPoint.X,startPoint.Y,e.X,e.Y);
}
效果:就只是画图,不能实现我要的效果
xinbada1985 2016-09-13
  • 打赏
  • 举报
回复
我手里没有这方面的代码,只能给你文字说明一下思想,首先你画多边形一定是点与点之间连线,每一个点就是一个顶点,相邻的三个点能算出一个角度,然后等距离而且同一个角度的点在画面上只有一个!肯定能算出来!把每个等距点算出来后连线就可以了!
暂无_34692516 2016-09-13
  • 打赏
  • 举报
回复
引用 3 楼 xinbada1985 的回复:
通过角度和距离就能算出内多变形和外多变形的坐标了
我脑袋空了,不知道怎么把它敲出来
暂无_34692516 2016-09-13
  • 打赏
  • 举报
回复
引用 1 楼 xinbada1985 的回复:
首先把多边形的每个角的顶点坐标记录下来,然后根据输入的距离,算他内部多变形的坐标,然后连线就可以了。
怎么记录顶点的坐标?
xinbada1985 2016-09-13
  • 打赏
  • 举报
回复
通过角度和距离就能算出内多变形和外多变形的坐标了
xinbada1985 2016-09-13
  • 打赏
  • 举报
回复
还有每个角的角度也要记录下来啊
xinbada1985 2016-09-13
  • 打赏
  • 举报
回复
首先把多边形的每个角的顶点坐标记录下来,然后根据输入的距离,算他内部多变形的坐标,然后连线就可以了。

111,076

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧