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); } } }
//=============================================================================================== 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); } }