航迹自动规划软件的部分代码
航迹规划是指在特定条件下,自动生成从初始点到目标点的最优运动轨迹,航迹规划是实现地形跟随,地形回避,威胁回避(TF/TA)飞行为目的的新一代低空技术,其目的就是要利用平时收集的地形等信息,规划出生存概率最大的巡航轨迹。
代码会不断更新....
运行环境 ms visual studio 2015 C# 和SQLSERVER 2014
源代码:
链接: https://pan.baidu.com/s/1rYLsyJ3bjFDCnLPlWzOJRA 提取码: bx52
数据库:
链接: https://pan.baidu.com/s/1u71bShbGVguHbPT4rz6bNQ 提取码: 9gbi
数据库恢复后,把SQLSERVER sa的密码改为3201319即可。
Delaunay三角网的生成
建立Voronoi图的关键是Delaunay三角网的生成。Delaunay三角网的特性:
(1)空圆性,任一三角形外接圆内部不包含其他点。
(2)最接近:以最近临的三点形成三角形,且各线段(三角形的边)皆不相交。
(3)唯一性:不论从区域何处开始构建,最终都将得到一致的结果。
(4)最优性:任意两个相邻三角形形成的凸四边形的对角线如果可以互换的话,那么两个三角形六个内角中最小的角度不会变大。
(5)最规则:如果将三角网中的每个三角形的最小角进行升序排列,则Delaunay三角网的排列得到的数值最大。
(6)区域性:新增、删除、移动某一个顶点时只会影响临近的三角形。
(7)具有凸多边形的外壳:三角网最外层的边界形成一个凸多边形的外壳。
Delaunay剖分是一种三角剖分的标准,实现它有多种算法。
本次采用Bowyer-Watson算法,算法的基本步骤是:
(1)构造一个超级三角形,包含所有散点,放入三角形链表。
(2)将点集中的散点依次插入,在三角形链表中找出其外接圆包含
插入点的三角形(称为该点的影响三角形),删除影响三角形的公共边,将插入点同影响三角形的全部顶点连接起来,从而完成一个点在Delaunay三角形链表中的插入。
(3)根据优化准则对局部新形成的三角形进行优化。将形成的三角形放入Delaunay三角形链表。
(4)循环执行上述第2步,直到所有散点插入完毕。
关键步骤2如下图所示:
步骤3的局部优化的准则指的是:
1.对新形成的三角形进行优化,将两个具有共同边的三角形合成一个多边形。
2.以最大空圆准则作检查,看其第四个顶点是否在三角形的外接圆之内。
3.如果在,修正对角线即将对角线对调,即完成局部优化过程的处理。
LOP (Local Optimization Procedure)处理过程如下图所示:
代码会不断更新....
代码示例:class1类的代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WindowsxhForms1
{
//点
public class Site
{
public double x, y;
public Site()
{ }
public Site(double x, double y)
{
this.x = x;
this.y = y;
}
}
//三角形的边
public class Edge
{
public Site a, b;
public Edge(Site a, Site b)
{
this.a = a;
this.b = b;
}
}
public class DelaunayTriangle
{
Voronoi voronoi = new Voronoi();
public Site site1, site2, site3;//三角形三点
public Site centerPoint;//外界圆圆心
public double radius;//外接圆半径
public List<DelaunayTriangle> adjoinTriangle;//邻接三角形
public DelaunayTriangle(Site site1, Site site2, Site site3)
{
centerPoint = new Site();
this.site1 = site1;
this.site2 = site2;
this.site3 = site3;
//构造外接圆圆心以及半径
voronoi.circle_center(centerPoint, site1, site2, site3, ref radius);
}
}
public class vtdd //v图顶点类
{
public int id;
public string txmc;
public string txlx;
public int x;
public int y;
public int x1;
public int y1;
public string tp;
public vtdd(int id, string txmc,string txlx,int x,int y,int x1,int y1,string tp)
{
this.id = id;
this.txmc= txmc;
this.txlx = txlx;
this.x = x;
this.y = y;
this.x1 = x1;
this.y1 = y1;
this.tp = tp;
}
}
}
/
class2类的代码
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WindowsxhForms1
{
public partial class Voronoi
{
//根据Delaunay三角形网构造Voronoi图的边
public List<Edge> returnVoronoiEdgesFromDelaunayTriangles(List<DelaunayTriangle> allTriangle, List<Edge> voronoiRayEdgeList)
{
List<Edge> voronoiEdgeList = new List<Edge>();
//List<Edge> voronoiRayEdgeList = new List<Edge>();
for (int i = 0; i < allTriangle.Count; i++)
{
List<Edge> neighborEdgeList = new List<Edge>();//三角形邻接边集合
for (int j = 0; j < allTriangle.Count; j++)//为了找出邻接三角形数为2的三角形,即最外边的三角形,循环只能从0开始
{
if (j != i)//不与自身比较
{
Edge neighborEdge = findCommonEdge(allTriangle[i], allTriangle[j]);
if (neighborEdge != null)
{
neighborEdgeList.Add(neighborEdge);
//构造Voronoi边
Edge voronoiEdge = new Edge(allTriangle[i].centerPoint, allTriangle[j].centerPoint);
if (!voronoiEdgeList.Contains(voronoiEdge))
voronoiEdgeList.Add(voronoiEdge);
}
}
}
if (neighborEdgeList.Count == 2)//表示此三角形是外围三角形,Voronoi边需要射线
{
Site midpoint;
Edge rayEdge;
//找出最外边并寻找中点构造Voronoi射线边
if (isPointOnEdge(neighborEdgeList[0], allTriangle[i].site1) && isPointOnEdge(neighborEdgeList[1], allTriangle[i].site1))
{
midpoint = findMidPoint(allTriangle[i].site2, allTriangle[i].site3);
rayEdge = produceRayEdge(allTriangle[i].centerPoint, midpoint);//产生较长的射线,原理实现还是线段画出的线
voronoiRayEdgeList.Add(rayEdge);
}
if (isPointOnEdge(neighborEdgeList[0], allTriangle[i].site2) && isPointOnEdge(neighborEdgeList[1], allTriangle[i].site2))
{
midpoint = findMidPoint(allTriangle[i].site1, allTriangle[i].site3);
rayEdge = produceRayEdge(allTriangle[i].centerPoint, midpoint);
voronoiRayEdgeList.Add(rayEdge);
}
if (isPointOnEdge(neighborEdgeList[0], allTriangle[i].site3) && isPointOnEdge(neighborEdgeList[1], allTriangle[i].site3))
{
midpoint = findMidPoint(allTriangle[i].site1, allTriangle[i].site2);
rayEdge = produceRayEdge(allTriangle[i].centerPoint, midpoint);
voronoiRayEdgeList.Add(rayEdge);
}
}
}
return voronoiEdgeList;
}
//根据三角形链表返回三角形所有的边
public List<Edge> returnEdgesofTriangleList(List<DelaunayTriangle> allTriangle)
{
List<Edge> commonEdges = new List<Edge>();
for (int i = 0; i < allTriangle.Count; i++)
{
Edge edge1 = new Edge(allTriangle[i].site1, allTriangle[i].site2);
Edge edge2 = new Edge(allTriangle[i].site1, allTriangle[i].site3);
Edge edge3 = new Edge(allTriangle[i].site2, allTriangle[i].site3);
if (!commonEdges.Contains(edge1))
commonEdges.Add(edge1);
if (!commonEdges.Contains(edge2))
commonEdges.Add(edge2);
if (!commonEdges.Contains(edge3))
commonEdges.Add(edge3);
}
return commonEdges;
}
//根据点集构造Delaunay三角形网
public void setDelaunayTriangle(List<DelaunayTriangle> allTriangle, List<Site> sites)
{
for (int i = 0; i < sites.Count; i++)
{
List<DelaunayTriangle> tmpTriList = new List<DelaunayTriangle>();
//拷贝所有三角形
for (int j = 0; j < allTriangle.Count; j++)
{
tmpTriList.Add(allTriangle[j]);
}
//受影响的三角形链表
List<DelaunayTriangle> influenedTriangles = new List<DelaunayTriangle>();
//新形成的三角形链表
List<DelaunayTriangle> newTriangles = new List<DelaunayTriangle>();
//受影响三角形的公共边
List<Edge> commonEdges = new List<Edge>();
for (int j = 0; j < tmpTriList.Count; j++)
{
double lengthToCenter;//该点到圆心距离
lengthToCenter = distance2Point(tmpTriList[j].centerPoint, sites[i]);
if (lengthToCenter < tmpTriList[j].radius)
{
influenedTriangles.Add(tmpTriList[j]);//添加到受影响的三角形链表
allTriangle.Remove(tmpTriList[j]);//移除当前三角形
}
}
//从受影响的三角形链表中,形成新的三角形链表
for (int k = 0; k < influenedTriangles.Count; k++)
{
addNewDelaunayTriangle(newTriangles, influenedTriangles[k], sites[i]);
}
//查找受影响三角形的公共边
if (influenedTriangles.Count > 1)
{
commonEdges = findCommonEdges(influenedTriangles);
}
//将受影响三角形中的公共边所在的新形成的三角形排除
if (commonEdges.Count > 0)
{
remmoveTrianglesByEdges(newTriangles, commonEdges);
}
//对新形成的三角形进行局部优化
LOP(newTriangles);
//将优化后的新形成的三角形添加到三角形链表中
for (int k = 0; k < newTriangles.Count; k++)
{
allTriangle.Add(newTriangles[k]);
}
}
}
//移除所有边边所在的三角形
public void remmoveTrianglesByEdges(List<DelaunayTriangle> allTriangles, List<Edge> edges)
{
List<DelaunayTriangle> tmpTriList = new List<DelaunayTriangle>();
//拷贝所有三角形
for (int i = 0; i < allTriangles.Count; i++)
{
tmpTriList.Add(allTriangles[i]);
}
for (int i = 0; i < tmpTriList.Count; i++)
{
for (int j = 0; j < edges.Count; j++)
{
if (isEdgeOnTriangle(tmpTriList[i], edges[j]))
{
allTriangles.Remove(tmpTriList[i]);
}
}
}
}
//移除一条边所在的三角形
public void remmoveTrianglesByOneEdge(List<DelaunayTriangle> allTriangles, Edge edge)
{
List<DelaunayTriangle> tmpTriList = new List<DelaunayTriangle>();
//拷贝所有三角形
for (int i = 0; i < allTriangles.Count; i++)
{
tmpTriList.Add(allTriangles[i]);
}
for (int i = 0; i < tmpTriList.Count; i++)
{
if (isEdgeOnTriangle(tmpTriList[i], edge))
allTriangles.Remove(tmpTriList[i]);
}
}
//移除点所在的三角形
public void remmoveTrianglesByOnePoint(List<DelaunayTriangle> allTriangles, Site site)
{
List<DelaunayTriangle> tmpTriList = new List<DelaunayTriangle>();
//拷贝所有三角形
for (int i = 0; i < allTriangles.Count; i++)
{
tmpTriList.Add(allTriangles[i]);
}
for (int i = 0; i < tmpTriList.Count; i++)
{
if (isPointOnTriangle(tmpTriList[i], site))
allTriangles.Remove(tmpTriList[i]);
}
}
//判断边是否属于三角形
public bool isEdgeOnTriangle(DelaunayTriangle triangel, Edge edge)
{
int samePointNum = 0;
if (siteIsEqual(edge.a, triangel.site1) || siteIsEqual(edge.a, triangel.site2) || siteIsEqual(edge.a, triangel.site3))
samePointNum++;
if (siteIsEqual(edge.b, triangel.site1) || siteIsEqual(edge.b, triangel.site2) || siteIsEqual(edge.b, triangel.site3))
samePointNum++;
if (samePointNum == 2)
return true;
return false;
}
//判断点是否属于三角形
public bool isPointOnTriangle(DelaunayTriangle triangle, Site site)
{
if (siteIsEqual(site, triangle.site1) || siteIsEqual(site, triangle.site2) || siteIsEqual(site, triangle.site3))
return true;
return false;
}
//判断点是否在边上
public bool isPointOnEdge(Edge edge, Site site)
{
if (siteIsEqual(site, edge.a) || siteIsEqual(site, edge.b))
return true;
return false;
}
//将点与受影响的三角形三点连接,形成新的三个三角形添加到三角形链中
public void addNewDelaunayTriangle(List<DelaunayTriangle> allTriangles, DelaunayTriangle influenedTri, Site point)
{
allTriangles.Add(new DelaunayTriangle(influenedTri.site1, influenedTri.site2, point));
allTriangles.Add(new DelaunayTriangle(influenedTri.site1, influenedTri.site3, point));
allTriangles.Add(new DelaunayTriangle(influenedTri.site2, influenedTri.site3, point));
}
//对新形成的三角形进行局部优化
public List<DelaunayTriangle> LOP(List<DelaunayTriangle> newTriList)
{
List<DelaunayTriangle> resultTriList = new List<DelaunayTriangle>();
//拷贝新形成的三角
for (int i = 0; i < newTriList.Count; i++)
{
resultTriList.Add(newTriList[i]);
}
for (int i = 0; i < newTriList.Count; i++)
{
for (int j = i + 1; j < newTriList.Count; j++)
{
Edge commonEdge;//需要调整对角线的的三角形的公共边
Site anotherPoint = new Site();//新对角线的另一点
if (isInCircle(newTriList[j], newTriList[i].site1))//三角形点在外接圆内
{
//找出两个三角形的公共边
commonEdge = findCommonEdge(newTriList[i], newTriList[j]);
if (commonEdge != null)
{
//移除需要调整的三角形
resultTriList.Remove(newTriList[i]);
resultTriList.Remove(newTriList[j]);
//找出对角线的另一点
if (siteIsEqual(newTriList[j].site1, commonEdge.a) == false && siteIsEqual(newTriList[j].site1, commonEdge.b) == false)
anotherPoint = newTriList[j].site1;
if (siteIsEqual(newTriList[j].site2, commonEdge.a) == false && siteIsEqual(newTriList[j].site2, commonEdge.b) == false)
anotherPoint = newTriList[j].site2;
if (siteIsEqual(newTriList[j].site3, commonEdge.a) == false && siteIsEqual(newTriList[j].site3, commonEdge.b) == false)
anotherPoint = newTriList[j].site3;
//形成两个新的三角形
resultTriList.Add(new DelaunayTriangle(newTriList[i].site1, anotherPoint, commonEdge.a));
resultTriList.Add(new DelaunayTriangle(newTriList[i].site1, anotherPoint, commonEdge.b));
}
}
if (isInCircle(newTriList[j], newTriList[i].site2))//三角形点在外接圆内
{
//找出两个三角形的公共边
commonEdge = findCommonEdge(newTriList[i], newTriList[j]);
if (commonEdge != null)
{
//移除需要调整的三角形
resultTriList.Remove(newTriList[i]);
resultTriList.Remove(newTriList[j]);
//找出对角线的另一点
if (siteIsEqual(newTriList[j].site1, commonEdge.a) == false && siteIsEqual(newTriList[j].site1, commonEdge.b) == false)
anotherPoint = newTriList[j].site1;
if (siteIsEqual(newTriList[j].site2, commonEdge.a) == false && siteIsEqual(newTriList[j].site2, commonEdge.b) == false)
anotherPoint = newTriList[j].site2;
if (siteIsEqual(newTriList[j].site3, commonEdge.a) == false && siteIsEqual(newTriList[j].site3, commonEdge.b) == false)
anotherPoint = newTriList[j].site3;
//形成两个新的三角形
resultTriList.Add(new DelaunayTriangle(newTriList[i].site2, anotherPoint, commonEdge.a));
resultTriList.Add(new DelaunayTriangle(newTriList[i].site2, anotherPoint, commonEdge.b));
}
}
if (isInCircle(newTriList[j], newTriList[i].site3))//三角形点在外接圆内
{
//找出两个三角形的公共边
commonEdge = findCommonEdge(newTriList[i], newTriList[j]);
if (commonEdge != null)
{
//移除需要调整的三角形
resultTriList.Remove(newTriList[i]);
resultTriList.Remove(newTriList[j]);
//找出对角线的另一点
if (siteIsEqual(newTriList[j].site1, commonEdge.a) == false && siteIsEqual(newTriList[j].site1, commonEdge.b) == false)
anotherPoint = newTriList[j].site1;
if (siteIsEqual(newTriList[j].site2, commonEdge.a) == false && siteIsEqual(newTriList[j].site2, commonEdge.b) == false)
anotherPoint = newTriList[j].site2;
if (siteIsEqual(newTriList[j].site3, commonEdge.a) == false && siteIsEqual(newTriList[j].site3, commonEdge.b) == false)
anotherPoint = newTriList[j].site3;
//形成两个新的三角形
resultTriList.Add(new DelaunayTriangle(newTriList[i].site3, anotherPoint, commonEdge.a));
resultTriList.Add(new DelaunayTriangle(newTriList[i].site3, anotherPoint, commonEdge.b));
}
}
}
}
newTriList = resultTriList;
return resultTriList;//返回优化后的新形成的三角形
}
//找出受影响的三角形的公共边
public List<Edge> findCommonEdges(List<DelaunayTriangle> influenedTriangles)
{
List<Edge> coomonEdges = new List<Edge>();
Edge tmpEdge;
for (int i = 0; i < influenedTriangles.Count; i++)
{
for (int j = i + 1; j < influenedTriangles.Count; j++)
{
tmpEdge = findCommonEdge(influenedTriangles[i], influenedTriangles[j]);
if (tmpEdge != null)
{
coomonEdges.Add(tmpEdge);
}
}
}
return coomonEdges;
}
//找出两个三角形的公共边
public Edge findCommonEdge(DelaunayTriangle chgTri1, DelaunayTriangle chgTri2)
{
Edge edge;
List<Site> commonSites = new List<Site>();
if (siteIsEqual(chgTri1.site1, chgTri2.site1) || siteIsEqual(chgTri1.site1, chgTri2.site2) || siteIsEqual(chgTri1.site1, chgTri2.site3))
{
commonSites.Add(chgTri1.site1);
}
if (siteIsEqual(chgTri1.site2, chgTri2.site1) || siteIsEqual(chgTri1.site2, chgTri2.site2) || siteIsEqual(chgTri1.site2, chgTri2.site3))
{
commonSites.Add(chgTri1.site2);
}
if (siteIsEqual(chgTri1.site3, chgTri2.site1) || siteIsEqual(chgTri1.site3, chgTri2.site2) || siteIsEqual(chgTri1.site3, chgTri2.site3))
{
commonSites.Add(chgTri1.site3);
}
if (commonSites.Count == 2)
{
edge = new Edge(commonSites[0], commonSites[1]);
return edge;
}
return null;
}
//判断两点是否相同
public bool siteIsEqual(Site a, Site b)
{
if (a.x == b.x && a.y == b.y)
return true;
return false;
}
//找出亮点的中点
public Site findMidPoint(Site a, Site b)
{
Site midpoint = new Site((a.x + b.x) / 2.0, (a.y + b.y) / 2.0);
return midpoint;
}
//判断插入点是否在三角形边上
public Site[] isOnEdges(DelaunayTriangle triangle, Site site)
{
Site[] edges = new Site[2];
Site a = triangle.site1;
Site b = triangle.site2;
Site c = triangle.site3;
if ((site.y - a.y) * (site.x - b.x) == (site.y - b.y) * (site.x - a.x))//点在ab边上
{
edges[0] = a;
edges[1] = b;
}
if ((site.y - a.y) * (site.x - c.x) == (site.y - c.y) * (site.x - a.x))//点在ac边上
{
edges[0] = a;
edges[1] = c;
}
if ((site.y - b.y) * (site.x - c.x) == (site.y - c.y) * (site.x - b.x))//点在bc边上
{
edges[0] = b;
edges[1] = c;
}
return edges;
}
//判断点是否在三角形外接圆的内部
public bool isInCircle(DelaunayTriangle triangle, Site site)
{
double lengthToCenter;//该点到圆心距离
lengthToCenter = distance2Point(triangle.centerPoint, site);
if (lengthToCenter < triangle.radius)
{
return true;
}
return false;
}
//根据两点求以第一个点为起点的射线边
public Edge produceRayEdge(Site start, Site direction)
{
Site end = new Site();
Edge longEdge;
end.x = 100 * (direction.x - start.x) + start.x;//找出射线方向的较大的x终点
end.y = (direction.y - start.y) * (end.x - start.x) / (direction.x - start.x) + start.y;
longEdge = new Edge(start, end);
return longEdge;
}
//求两点之间距离
public double distance2Point(Site p, Site p2)
{
double value = Math.Sqrt(Math.Abs(p.x - p2.x) * Math.Abs(p.x - p2.x) + Math.Abs(p.y - p2.y) * Math.Abs(p.y - p2.y));
return value;
}
//求三角形的外接圆心
public void circle_center(Site center, Site sites0, Site sites1, Site sites2, ref double radius)
{
double x1, x2, x3, y1, y2, y3;
double x = 0;
double y = 0;
x1 = sites0.x;
x2 = sites1.x;
x3 = sites2.x;
y1 = sites0.y;
y2 = sites1.y;
y3 = sites2.y;
x = ((y2 - y1) * (y3 * y3 - y1 * y1 + x3 * x3 - x1 * x1) - (y3 - y1) * (y2 * y2 - y1 * y1 + x2 * x2 - x1 * x1)) / (2 * (x3 - x1) * (y2 - y1) - 2 * ((x2 - x1) * (y3 - y1)));
y = ((x2 - x1) * (x3 * x3 - x1 * x1 + y3 * y3 - y1 * y1) - (x3 - x1) * (x2 * x2 - x1 * x1 + y2 * y2 - y1 * y1)) / (2 * (y3 - y1) * (x2 - x1) - 2 * ((y2 - y1) * (x3 - x1)));
center.x = x;
center.y = y;
radius = Math.Sqrt(Math.Abs(sites0.x - x) * Math.Abs(sites0.x - x) + Math.Abs(sites0.y - y) * Math.Abs(sites0.y - y));
}
}
}
界面画图部分的代码
private void button13_Click(object sender, EventArgs e)
{
xhForm5 form5 = new xhForm5();
//form5.MdiParent = this;
Intent.dict["xhForm2_label7_text"] = textBox1.Text;
if (form5.ShowDialog() == DialogResult.OK)
{
textBox1.Text = Intent.dict["form5_textbox1_text"]+"";
}
///从数据表temp_txb 读出数据,写屏幕
string conStr = "Server =(local); Initial Catalog = bhjs; Integrated Security = True; User Id = sa;Password =3201319";
SqlConnectionStringBuilder scsb = new SqlConnectionStringBuilder();
//连接库并打开
SqlConnection conn = new SqlConnection(conStr);
if (conn.State == System.Data.ConnectionState.Closed)
conn.Open();
//拼接SQL语句
string strSQL = "SELECT * FROM temp_txb where txmc="+"'"+textBox1.Text+"'" +"order by x"; //执行SQL语句取temp_txb记录 //按点集坐标X值排序
da = new SqlDataAdapter(strSQL, conn);
ds = new DataSet();
da.Fill(ds, "temp_txb");
//绑定数据到dataGridView
dataGridView1.DataSource = ds;
dataGridView1.DataMember = "temp_txb";
int zcount = dataGridView1.RowCount - 1;
for (int i = 0; i < zcount; i++)
{
int x = int.Parse(dataGridView1.Rows[i].Cells[3].Value.ToString());
int y = int.Parse(dataGridView1.Rows[i].Cells[4].Value.ToString());
int txlx = int.Parse(dataGridView1.Rows[i].Cells[2].Value.ToString()); //图形类型
if (txlx == 1) //标注雷达站
{
g.FillEllipse(Brushes.White, x, y, 8, 8);
//Site site = new Site(x, y);
//sitesP.Add(site);
}
if (txlx == 4) //标注起飞点
{
Pen redpen = new Pen(Color.Red, 2);
// g.FillEllipse(Brushes.White, e.X, e.Y, 4, 4);
g.DrawEllipse(redpen, x, y, 8, 8);
}
//写入数据库表
//将背景图填充到pictureBox中
pictureBox1.Image = backImage;
//从数据表temp_txb 读出数据,写屏幕
}
}
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
if (xdwxdlx==1) //标注雷达站
{
g.FillEllipse(Brushes.White, e.X, e.Y, 8, 8);
//写入数据库表
/
string conStr = "Server =(local); Initial Catalog = bhjs; Integrated Security = True; User Id = sa;Password =3201319";
string strSQL = "insert into temp_txb values (" + "'" + textBox1.Text + "'" + "," + 1+"," +e.X +","+e.Y + ")";//sql语句
//连接库并打开
SqlConnection conn = new SqlConnection(conStr);
if (conn.State == System.Data.ConnectionState.Closed)
conn.Open();
SqlCommand cmd = new SqlCommand(strSQL, conn);
int result = cmd.ExecuteNonQuery();
/
重新读入一次数据
g.Clear(Color.Black);
//string conStr = "Server =(local); Initial Catalog = bhjs; Integrated Security = True; User Id = sa;Password =3201319";
SqlConnectionStringBuilder scsb = new SqlConnectionStringBuilder();
//连接库并打开
// SqlConnection conn = new SqlConnection(conStr);
if (conn.State == System.Data.ConnectionState.Closed)
conn.Open();
//拼接SQL语句
strSQL = "SELECT * FROM temp_txb where txmc=" + "'" + textBox1.Text + "'" + "order by x"; //执行SQL语句取temp_txb记录 //按点集坐标X值排序
da = new SqlDataAdapter(strSQL, conn);
ds = new DataSet();
da.Fill(ds, "temp_txb");
//绑定数据到dataGridView
dataGridView1.DataSource = ds;
dataGridView1.DataMember = "temp_txb";
int zcount = dataGridView1.RowCount - 1;
for (int i = 0; i < zcount; i++)
{
int x = int.Parse(dataGridView1.Rows[i].Cells[3].Value.ToString());
int y = int.Parse(dataGridView1.Rows[i].Cells[4].Value.ToString());
int txlx = int.Parse(dataGridView1.Rows[i].Cells[2].Value.ToString()); //图形类型
if (txlx == 1) //标注雷达站
{
g.FillEllipse(Brushes.White, x, y, 8, 8);
}
//将背景图填充到pictureBox中
pictureBox1.Image = backImage;
}
重新读入一次数据
//pictureBox1.Image = backImage; //更新pictureBox背景图片
xdwxdlx = 0; //图形类型置空
textBox2.Text = "";
sbzt = 0; //鼠标按键释放
}
if (xdwxdlx == 4) //标注起飞点
{
Pen redpen = new Pen(Color.Red, 2);
// g.FillEllipse(Brushes.White, e.X, e.Y, 4, 4);
g.DrawEllipse(redpen, e.X, e.Y, 8, 8);
pictureBox1.Image = backImage; //更新pictureBox背景图片
//写入数据库表
/
string conStr = "Server =(local); Initial Catalog = bhjs; Integrated Security = True; User Id = sa;Password =3201319";
string strSQL = "insert into temp_txb values (" + "'" + textBox1.Text + "'" + "," + 4 + "," + e.X + "," + e.Y + ")";//sql语句
//连接库并打开
SqlConnection conn = new SqlConnection(conStr);
if (conn.State == System.Data.ConnectionState.Closed)
conn.Open();
SqlCommand cmd = new SqlCommand(strSQL, conn);
int result = cmd.ExecuteNonQuery();
/
}
}
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
label3.Text = e.X + ", " + e.Y;
if (xdwxdlx == 10)
{
if (sbzt == 1)
{
//清除屏幕上原有图型
g.FillEllipse(Brushes.White, e.X, e.Y, 8, 8);
//pictureBox1.Image = backImage; //更新pictureBox背景图片
//生成拖动图型
// g.FillEllipse(Brushes.Black, e.X, e.Y, 20, 20);
pictureBox1.Image = backImage; //更新pictureBox背景图片
}
}
}
private void pictureBox1_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left) //鼠标按下左键
{
sbzt = 1;
int x = e.X;
int y = e.Y;
int zcount = dataGridView1.RowCount - 1;
for (int i = 0; i < zcount; i++)
{
int txid= int.Parse(dataGridView1.Rows[i].Cells[0].Value.ToString());
int x1 = int.Parse(dataGridView1.Rows[i].Cells[3].Value.ToString());
int y1 = int.Parse(dataGridView1.Rows[i].Cells[4].Value.ToString());
int txlx = int.Parse(dataGridView1.Rows[i].Cells[2].Value.ToString()); //图形类型
// xdwxdlx = txlx; //这句考虑下
sjkdxlx = txlx;
if (x >= x1 - 6 && x <= x1 + 6)
{
if (y >= y1 - 6 && y <= y1 +6)
{
/// 删除临时temp_txb中原来记录
string conStr = "Server =(local); Initial Catalog = bhjs; Integrated Security = True; User Id = sa;Password =3201319";
string strSQL = "delete temp_txb where id="+ txid;//sql语句
//连接库并打开
SqlConnection conn = new SqlConnection(conStr);
if (conn.State == System.Data.ConnectionState.Closed)
conn.Open();
SqlCommand cmd = new SqlCommand(strSQL, conn);
int result = cmd.ExecuteNonQuery();
//
// TdDraw(txlx, e.X, e.Y);
}
}
}
}
if (e.Button == MouseButtons.Right ) //鼠标按下右键
{
int x = e.X;
int y = e.Y;
int zcount = dataGridView1.RowCount - 1;
for (int i = 0; i < zcount; i++)
{
int txid = int.Parse(dataGridView1.Rows[i].Cells[0].Value.ToString());
string txmc= dataGridView1.Rows[i].Cells[1].Value.ToString();
int x1 = int.Parse(dataGridView1.Rows[i].Cells[3].Value.ToString());
int y1 = int.Parse(dataGridView1.Rows[i].Cells[4].Value.ToString());
int txlx = int.Parse(dataGridView1.Rows[i].Cells[2].Value.ToString()); //图形类型
// xdwxdlx = txlx; //这句考虑下
sjkdxlx = txlx;
if (x >= x1 - 6 && x <= x1 + 6)
{
if (y >= y1 - 6 && y <= y1 + 6)
{
打开关联窗口
xhForm6 form6 = new xhForm6();
form6.label6.Text = txid.ToString();
form6.label8.Text = txmc;
form6.Show() ;
}
}
}
}