private void BuildAreas()
        {
            var rPrevAreas = new List <AreaAABB>(this.mCurrentAreas);

            this.mCurrentAreas.Clear();

            // 找到所有的区域与区域之间线段的交点
            for (int i = 0; i < rPrevAreas.Count; i++)
            {
                rPrevAreas[i].InitSides();
                this.BuildArea(rPrevAreas[i]);
                mCurrentAreas.Add(rPrevAreas[i]);
            }

            // 根据线段的交点找到哪些线是需要隐藏的
            for (int i = 1; i < mCurrentAreas.Count; i++)
            {
                for (int j = 0; j < i; j++)
                {
                    for (int k = 0; k < mCurrentAreas[i].Sides.Count; k++)
                    {
                        AreaSide rSide = mCurrentAreas[i].Sides[k];
                        for (int p = 0; p < rSide.Lines.Count; p++)
                        {
                            if (mCurrentAreas[j].IsContainLine(rSide.Lines[p]))
                            {
                                rSide.Lines[p].State = 1;
                            }
                        }
                    }
                }
            }

            for (int i = 0; i < mCurrentAreas.Count; i++)
            {
                // 找Area中的线所在的所有所属区域
                for (int j = 0; j < mCurrentAreas[i].Sides.Count; j++)
                {
                    for (int k = 0; k < mCurrentAreas[i].Sides[j].Lines.Count; k++)
                    {
                        Line     rLine             = mCurrentAreas[i].Sides[j].Lines[k];
                        AreaAABB rHighestOrderArea = GetHighestOrderArea(rLine, mCurrentAreas[i]);
                        if (rHighestOrderArea != null)
                        {
                            if (rHighestOrderArea.UID == mCurrentAreas[i].UID)
                            {
                                rLine.State = 1;
                            }
                        }
                    }
                }
            }
        }
            public void InitSides()
            {
                this.Sides = new List <AreaSide>();

                AreaSide rDownSide = new AreaSide()
                {
                    Index = 0, Points = new List <Vector3>()
                };

                rDownSide.EdgeLine = new Line()
                {
                    Start = this.Rect.Min, End = new Vector3(this.Rect.Max.x, 0, this.Rect.Min.z)
                };                                                                                                                  // min.z 一样
                rDownSide.SortPoints();
                this.Sides.Add(rDownSide);

                AreaSide rRightSide = new AreaSide()
                {
                    Index = 1, Points = new List <Vector3>()
                };

                rRightSide.EdgeLine = new Line()
                {
                    Start = new Vector3(this.Rect.Max.x, 0, this.Rect.Min.z), End = this.Rect.Max
                };                                                                                                                  // Max.x 一样
                rRightSide.SortPoints();
                this.Sides.Add(rRightSide);

                AreaSide rUpSide = new AreaSide()
                {
                    Index = 2, Points = new List <Vector3>()
                };

                rUpSide.EdgeLine = new Line()
                {
                    Start = this.Rect.Max, End = new Vector3(this.Rect.Min.x, 0, this.Rect.Max.z)
                };                                                                                                                  // Max.z 一样
                rUpSide.SortPoints();
                this.Sides.Add(rUpSide);

                AreaSide rLeftSide = new AreaSide()
                {
                    Index = 3, Points = new List <Vector3>()
                };

                rLeftSide.EdgeLine = new Line()
                {
                    Start = new Vector3(this.Rect.Min.x, 0, this.Rect.Max.z), End = this.Rect.Min
                };                                                                                                                 // Min.x 一样
                rLeftSide.SortPoints();
                this.Sides.Add(rLeftSide);
            }
        /// <summary>
        /// 判断一个Side是否和一个Area相交,如果相交了,分别把Side和AABB的边裁减成多个线段
        /// </summary>
        public void Intersect_Side_AreaAABB(AreaSide rSide, AreaAABB rArea)
        {
            List <Vector3> rTempPoints = new List <Vector3>(rSide.Points);
            Line           rLine       = rSide.EdgeLine;

            for (int j = 0; j < rArea.Sides.Count; j++)
            {
                List <Vector3> rTempAreaPoints = new List <Vector3>(rArea.Sides[j].Points);
                Line           rAreaLine       = rArea.Sides[j].EdgeLine;
                this.GetIntersectPoint_AABB(rLine, rAreaLine, rTempPoints, rTempAreaPoints);
                rArea.Sides[j].Points = rTempAreaPoints;
                rArea.Sides[j].SortPoints();
            }
            rSide.Points = rTempPoints;
            rSide.SortPoints();
        }