Esempio n. 1
0
        void ExtendEdgeWaypoint(EdgeWaypoint w)         //扩展边中点
        {
            int p1 = (w.border == null) ? -1 : w.border.belong_poly;
            int p2 = (w.border == null) ? -1 : w.border.neighbor_poly;

            if (p1 != -1 && polys[p1].enterable)
            {
                Polygon p = polys[p1];
                foreach (Border b in p.borders)
                {
                    FPoint fp = b.GetMid();
                    PushEdgeWaypoint(fp, b, w);

                    PushVertexWaypoint(b.from, b.from_idx, w);
                }
            }

            if (p2 != -1 && polys[p2].enterable)
            {
                Polygon p = polys[p2];
                foreach (Border b in p.borders)
                {
                    FPoint fp = b.GetMid();
                    PushEdgeWaypoint(fp, b, w);

                    PushVertexWaypoint(b.from, b.from_idx, w);
                }
            }
        }
Esempio n. 2
0
        //===============================================================================================
        void PushEdgeWaypoint(FPoint fp, Border border, Waypoint parent)         //凭借border可以判断done标志
        {
            //在Close表中,退出
            if (close.IsContainsPos(fp))
            {
                return;
            }

            //在Open表中否?
            Waypoint w = open.GetWaypointFromXY(fp);

            if (w != null)
            {
                //在Open表中,可优化否?
                float d = fp.Distance(parent.fp);

                if (w.G > parent.G + d)                 //可优化
                {
                    open.Delete(w);

                    w.parent = parent;
                    w.G      = parent.G + d;
                    w.F      = w.G + w.H;

                    open.Add(w);
                }
            }
            else
            {
                //不在Open表中
                int     p1  = border.belong_poly;
                int     p2  = border.neighbor_poly;
                Polygon po1 = (p1 == -1) ? null : polys[p1];
                Polygon po2 = (p2 == -1) ? null : polys[p2];

                bool done = (po1 == dst_poly || po2 == dst_poly) ? true : false;
                w = new EdgeWaypoint(fp, parent, border, done);

                open.Add(w);
            }
        }