航迹自动规划软件的部分代码

航迹规划是指在特定条件下,自动生成从初始点到目标点的最优运动轨迹,航迹规划是实现地形跟随,地形回避,威胁回避(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() ;
                        }
                            
                    }


                }
            }