/// <summary> /// 判断是否相交 /// </summary> /// <param name="a"></param> /// <param name="b"></param> /// <returns></returns> public static bool CheckIntersection(CullUnit a, CullUnit b) { if (b.max < a.min) { return(false); } if (b.min > a.max) { return(false); } return(true); }
/// <summary> /// 合并两个 /// </summary> /// <param name="v"></param> public void Combine(CullUnit v) { this.min = System.Math.Min(this.min, v.min); this.max = System.Math.Max(this.max, v.max); if (this.listIndex == null) { this.listIndex = new List <int>(); } if (v.listIndex != null && v.listIndex.Count > 0) { this.listIndex.AddRange(v.listIndex); } this.pointCounts += v.pointCounts; }
/// <summary> /// 添加一个挡格。 /// </summary> /// <param name="ContourPolyIndex"></param> /// <param name="ab"></param> public static void Process(int index, TreeData data, bool isXCuling) { if (data == null) { return; } CullUnit unit = null; if (isXCuling == true) { unit = new CullUnit(data.min.x, data.max.x, index, data.Count); } else { unit = new CullUnit(data.min.y, data.max.y, index, data.Count); } AddLineUnit(ref s_ListLineUnit, unit); }
/// <summary> /// 查找到相交的区间 /// </summary> /// <param name="listLineUnit"></param> /// <param name="unit"></param> /// <param name="retIndex"></param> /// <returns></returns> private static void AddLineUnit(ref List <CullUnit> listLineUnit, CullUnit unit) { if (listLineUnit.Count > 0) { bool isHaveCombine = false; // 找到起始位置 for (int i = 0; i < listLineUnit.Count; i++) { if (CullUnit.CheckIntersection(unit, listLineUnit[i]) == true) { if (isHaveCombine == false) { isHaveCombine = true; listLineUnit[i].Combine(unit); unit = listLineUnit[i]; } else { unit.Combine(listLineUnit[i]); listLineUnit.RemoveAt(i); i--; } } else if (unit.max < listLineUnit[i].min) { if (isHaveCombine == false) { listLineUnit.Insert(i, unit); isHaveCombine = true; } break; } } if (isHaveCombine == false) { listLineUnit.Insert(listLineUnit.Count, unit); } } else { listLineUnit.Add(unit); } }