[地理信息系统课程设计报告]
flag = false;
} if (flag) j++;
} //删除重复的边
edjest = Delete(edjest);
triangle = NewTriangle(pt, edjest); i++;
}
//删除以超级三角形顶点为顶点的三角形 triangle = SuperDelete(supertriangle); //删除凹边界处三角形
triangle = TraingleDelete();
using (Graphics g = this.picMap.CreateGraphics()) {
for (int j = 0; j < triangle.Count; j++) {
Point[] myPoint = newPoint[3];
myPoint[0] = (Point)triangle[j][0]; myPoint[1] = (Point)triangle[j][1]; myPoint[2] = (Point)triangle[j][2];
g.DrawPolygon(newPen(Brushes.Red,3), myPoint); } }
构建泰森多边形需要构建三角网。找出每个离散点周围的三角形即以该离散点为共同顶点的三角形,按逆时针排列起来以便下一步生成泰森多边形,连接该离散点周围三角形的外接圆的圆心。三角网边界处的泰森多边形可做垂直平分线与图廓相交,与图廓一起形成泰森多边形。(代码见附录)
重点代码示例:
//使三角形三个点坐标都按逆时针方向存储 triangle= Thiessen.SortTraingle(triangle); //存储三角网所有三角形的边 Thiessen.Edge(triangle); //构成边界的边集合
Thiessen.BorderEdge(Thiessen.allEdge); //寻找以边界点为顶点的三角形集合
Thiessen.BorderTriangle(Thiessen.borderEdge, triangle); //除边界点外其他离散点
Thiessen.CenterPoint(myPoints, Thiessen.borderEdge); //除边界点外其他离散点构成的泰森多边形集合
Thiessen.ThiessenEdge(triangle, Thiessen.centerpoint); //边界离散点构成的泰森多边形集合
Thiessen.MyBorderTheissen(Thiessen.borderEdge, Thiessen.myBorderTriangle);
[地理信息系统课程设计报告]13 / 38
[地理信息系统课程设计报告]
using (Graphics g = this.picMap.CreateGraphics()) {
//绘制除边界点外其他离散点构成的泰森多边形集合 for (int i = 0; i g.DrawPolygon(newPen(Brushes.Black,3), Thiessen.myTheissen[i].ToArray()); } //绘制边界离散点构成的泰森多边形集合 for (int i = 0; i g.DrawPolygon(newPen(Brushes.Black,3), Thiessen.myBorderTheissen[i].ToArray()); } } 八、源代码附录 1、用户登录源码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; namespace MyMap { publicpartialclassLoginWindow : Form { public LoginWindow() { InitializeComponent(); } privatevoid btnLogin_Click(object sender, EventArgs e) { if (txtUserName.Text.Length <= 0) { MessageBox.Show(\请输入用户名\); return; } if (txtpwdPassword.Text.Length <= 0) [地理信息系统课程设计报告]14 / 38 [地理信息系统课程设计报告] { MessageBox.Show(\请输入密码!\); return; } DataSet ds = SqlHelper.ExecuteDataSet(@\, newSqlParameter(\, txtUserName.Text)); if (ds.Tables[0].Rows.Count <= 0) { MessageBox.Show(\用户不存在!\); return; } if (ds.Tables[0].Rows.Count > 1) { thrownewException(\不好啦!重复了!\); } DataRow row = ds.Tables[0].Rows[0]; string password = (string)row[\]; long id = (long)row[\]; int errortimes = (int)row[\]; //错误次数大于3时 //防御性编程 if (errortimes >= 3) { DateTime date = (DateTime)row[\]; TimeSpan ts = DateTime.Now - date; if (ts.TotalMinutes <= 30) { MessageBox.Show(@\输入错误次数太多,用户已被锁定,请于30分钟后再登陆,剩余时间 \ + (30 - ts.TotalMinutes).ToString(\) + \分钟\,\错误提示\,MessageBoxButtons.OK,MessageBoxIcon.Error); return; } else { //输错三次后30分钟后更新ErorrTimes=0 SqlHelper.NonQuery(@\, newSqlParameter(\, id)); } } if (password == txtpwdPassword.Text) { DialogResult result= MessageBox.Show(\欢迎您登陆!\,\用户登录\,MessageBoxButtons.OKCancel,MessageBoxIcon.Question); this.Hide(); if (result == DialogResult.OK) [地理信息系统课程设计报告]15 / 38 [地理信息系统课程设计报告] { MapWindow mw = newMapWindow(); DialogResult mapresult= mw.ShowDialog(); if(mapresult==DialogResult.Cancel) { Application.Exit(); } } else { Application.Exit(); } } else { MessageBox.Show(\密码错误!\); SqlHelper.NonQuery(@\Id=@id\, newSqlParameter(\, id)); object date = row[\]; if (date == DBNull.Value) { date = DateTime.Now; } TimeSpan ts = DateTime.Now - Convert.ToDateTime(date); if (ts.TotalMinutes > 5) { SqlHelper.NonQuery(@\, newSqlParameter(\, id)); } return; } } privatevoid btnCancel_Click(object sender, EventArgs e) { this.Close(); } privatevoid btnRegister_Click(object sender, EventArgs e) { DataSet ds = SqlHelper.ExecuteDataSet(@\, newSqlParameter(\, txtUserName.Text)); if (ds.Tables[0].Rows.Count >= 1) { //throw new Exception(\不好啦!重复了!\ MessageBox.Show(\用户名已存在,请重新输入用户名注册\); [地理信息系统课程设计报告]16 / 38
相关推荐: