// ========================================== 合并 ============================================= // /// <summary> /// 合并两个交叉的多边形(多边形必须先转换为顺时针方向,调用CW()函数!) /// </summary> /// <param name="other"></param> /// <param name="polyRes"></param> /// <returns></returns> public PolyResCode Union(Polygon other, ref List <Polygon> polyRes) { if (this.m_lstPoints.Count == 0 || other.m_lstPoints.Count == 0) { return(PolyResCode.ErrEmpty); } else if (!NMath.CheckCross(GetCoverRect(), other.GetCoverRect())) { return(PolyResCode.ErrNotCross); } // 转换为顺时针方向 //this.CW(); //other.CW(); List <NavNode> mainNode = new List <NavNode>(); //主多边形顶点 List <NavNode> subNode = new List <NavNode>(); //需要合并的多边形顶点 // init main nodes for (int i = 0; i < this.m_lstPoints.Count; i++) { NavNode currNode = new NavNode(this.m_lstPoints[i], false, true); if (i > 0) { NavNode preNode = mainNode[i - 1]; preNode.next = currNode; } mainNode.Add(currNode); } // init sub nodes for (int j = 0; j < other.m_lstPoints.Count; j++) { NavNode currNode = new NavNode(other.m_lstPoints[j], false, false); if (j > 0) { NavNode preNode = subNode[j - 1]; preNode.next = currNode; } subNode.Add(currNode); } int insCnt = 0; PolyResCode result = NavUtil.NavNodeIntersectPoint(mainNode, subNode, out insCnt); if (result == PolyResCode.Success && insCnt > 0) { if (insCnt % 2 != 0) { return(PolyResCode.ErrCrossNum); } else { PolyResCode linkRes = NavUtil.LinkToPolygon(mainNode, subNode, ref polyRes); return(linkRes); } } return(PolyResCode.ErrCrossNum); }
/// <summary> /// 初始化创建导航网格需要的数据 /// </summary> /// <param name="polyAll">所有阻挡区域</param> /// <returns></returns> private NavResCode InitData(List <Polygon> polyAll) { allEdges = new List <Line2D>(); allPoints = new List <Vector2>(); PolyResCode resCode = NavUtil.UnionAllPolygon(ref polyAll); if (resCode != PolyResCode.Success) { return(NavResCode.Failed); } // 保存所有点和边 foreach (Polygon poly in polyAll) { if (poly.GetPoints().Count < 3) { continue; } AddPoint(poly.GetPoints()); AddEdge(poly.GetPoints()); } if (polyAll != null && polyAll.Count > 0) { startEdge = new Line2D(polyAll[0].GetPoints()[0], polyAll[0].GetPoints()[1]); } return(NavResCode.Success); }
/// <summary> /// 用于合并传进来的多边形数组,返回合并后的多边形数组, /// 如果生成了孤岛,则孤岛的tag标志递增 /// </summary> /// <param name="polys"></param> /// <returns></returns> public static PolyResCode UnionAllPolygon(ref List <Polygon> polys) { int tag = 1; for (int i = 0; i < polys.Count; i++) { polys[i].CW(); } for (int i = 1; i < polys.Count; i++) { Polygon p1 = polys[i]; for (int j = 1; j < polys.Count; j++) { Polygon p2 = polys[j]; if (i != j && !p1.Equals(p2)) { List <Polygon> polyResult = new List <Polygon>(); PolyResCode result = p1.Union(p2, ref polyResult); if (result == PolyResCode.Success && polyResult.Count > 0) { polys.Remove(p1); polys.Remove(p2); for (int k = 0; k < polyResult.Count; k++) { Polygon poly = polyResult[k]; if (/*polyResult.Count > 1 &&*/ !poly.IsCW()) { poly.SetTag(tag++);//如果逆时针说明这个多边形是孤岛 } polys.Add(poly); } i = -1; break; } } } } return(PolyResCode.Success); }