Ejemplo n.º 1
0
        Point delta = new Point();              //鼠标手动偏移量

        private void frmSec_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Middle)
            {
                from.X = e.X;
                from.Y = e.Y;
            }
            else
            {
                //完成屏幕坐标->DisplayTopology映射
                PointF[] pos = { new PointF(e.X, e.Y) };
                trans_C2D.TransformPoints(pos);

                if (e.Button == MouseButtons.Left)
                {
                    d = new FPoint(pos[0].X, pos[0].Y);
                }
                else if (e.Button == MouseButtons.Right)
                {
                    s = new FPoint(pos[0].X, pos[0].Y);
                }

                //高精度计时器测量寻径耗时
                QueryPerformance.Start();
                w = pf.PathFinding(s, d);
                QueryPerformance.End();
                this.Text = QueryPerformance.GetMessage();

                //选择多边形
                selected = display.SelectPolygon(pos[0].X, pos[0].Y);

                Refresh();
            }
        }
Ejemplo n.º 2
0
        //========================================================================================================
        public void LOS_Engine(FPoint from, FPoint to)
        {
            int srcp = topo.SelectPolygon(from.x, from.y);
            int dstp = topo.SelectPolygon(to.x, to.y);

            if (srcp == -1 || dstp == -1)
            {
                return;
            }
            if (!topo.polys[srcp].enterable || !topo.polys[dstp].enterable)
            {
                return;
            }

            lfp.Add(from);

            if (srcp == dstp)
            {
                lfp.Add(to);
                return;
            }

            Vector2 n0 = GetV2(from, to);

            n0.Normalize();

            TestBorderCall(from, n0, topo.polys[srcp]);
            do
            {
                switch (ret.result)
                {
                case RESULT.TEST_BORDER:
                    TestVertexPolygon(ret.p0, ret.n0, ret.poly);
                    break;

                case RESULT.TEST_VERTEX:
                    TestPureVertex(ret.p0, ret.n0);
                    break;
                }

                //以下是检测LOS是否可终止
                Polygon dst = topo.polys[dstp];

                switch (ret.result)
                {
                case RESULT.TEST_BORDER:
                    if (ret.poly == dst)
                    {
                        lfp.Add(to);
                        return;
                    }
                    break;

                case RESULT.TEST_VERTEX:
                    FPoint fp = lfp[lfp.Count - 1];
                    foreach (Border b in dst.borders)
                    {
                        if (fp.Equals(b.from))
                        {
                            lfp.Add(to);
                            return;
                        }
                    }
                    break;
                }
            } while (ret.result != RESULT.TEST_END);
        }
Ejemplo n.º 3
0
        int[] dst_fpidx;                //目标多边形的顶点索引,用于判断VertexWaypoint是否与目标点直接相邻

        public Waypoint PathFinding(FPoint srcfp, FPoint dstfp)
        {
            //起点、终点必须不为空
            if (srcfp == null || dstfp == null)
            {
                return(null);
            }

            //验证起点、终点所在多边形的合法性
            int srcp = topo.SelectPolygon(srcfp.x, srcfp.y);
            int dstp = topo.SelectPolygon(dstfp.x, dstfp.y);

            if (srcp == -1 || dstp == -1 || !polys[srcp].enterable || !polys[dstp].enterable)
            {
                return(null);
            }

            //设置路径规划终点
            Waypoint.SetDest(dstfp);

            //设置目标多边形
            dst_poly = polys[dstp];

            //标记目标多边形的顶点
            dst_fpidx = new int[dst_poly.num_borders];
            for (int i = 0; i < dst_poly.num_borders; i++)
            {
                dst_fpidx[i] = dst_poly.borders[i].from_idx;
            }

            //----------------------------------------------------------------------------
            open.Clear();
            close.Clear();

            Waypoint start = new Waypoint(srcfp, null, false);

            close.Add(start);             //!!!保证open里面只有edgew和vertexw两类位点

            if (srcp == dstp)
            {
                Waypoint end = new Waypoint(dstfp, start, true);
                return(end);
            }
            else
            {
                ExtendStartWaypoint(start, srcp);
            }

            //----------------------------------------------------------------------------
            Waypoint w;

            while (!open.IsEmpty())
            {
                w = open.GetLeastWaypoint();

                if (w.done)                 //如果w与目标点直接相邻
                {
                    Waypoint end = new Waypoint(dstfp, w, true);
                    return(end);
                }

                open.Delete(w);
                close.Add(w);

                ExtendAdjacentWaypoints(w);
            }

            return(null);
        }