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(); }