Пример #1
0
        // ========================================== 合并 ============================================= //

        /// <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);
        }
Пример #2
0
        /// <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);
        }
Пример #3
0
        /// <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);
        }