计算机图形学 c#实现 多边形相关算法
1.鼠标画多边形
画图首先需要画板,即GDI+的Graphics类。
为了在全局中使用Graphics类。
- 首先定义全局变量
List pt1 = new List(); 记录鼠标点击的点坐标
int num1 = 0; 记录个数
Point mouseLocation; 记录鼠标移动的坐标
Graphics g; 定义画图类
- 往界面中拖入pictureBox1,添加事件pictureBox1_Paint
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-90qZIHsq-1597068216751)(assets/1596978963768.png)]
- 将picturebox1与画图类绑定,则picturebox1为我们的画板
- 为了获得鼠标点击的坐标,在click函数中是没有e.location这个属性的,只能通过pictureBox1_MouseMove中记录下e.location。
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
this.mouseLocation = e.Location;
}
private void pictureBox1_Click(object sender, EventArgs e)
{
if (flag && type==1)
{
num1++;
pt1.Add(this.mouseLocation);
if (num1 > 1)
g.DrawLine(Pens.Black, pt1[num1 - 2], pt1[num1 - 1]);//画直线
}
}
- 右键,将多边形首尾相连,画图结束。c#和MFC不一样,MFC的左键点击和右键点击函数不一样,c#只有通过添加pictureBox1_MouseDown函数,再通过判断e.Button == MouseButtons.Right来判断
2.判断多边形是否有效
主要是判断多边形是否自相交
我写的逻辑可能有点复杂?不知道能不能说清楚
简单来说,就是判断两条没有公共顶点的线,其交点在不在线段上
在polygon类里定义一个isvalid函数。调用ifintersect函数,判断线段a1b1在a2b2的交点,是否在范围内
public bool isvalid()
{
//至少三个顶点
if (num < 3)
return false;
//判断多边形是否相交
f