/// <summary> /// 将两个序号相邻,但几何相离的两个台阶子区间进行合并 /// </summary> /// <param name="backStair">桩号较小</param> /// <param name="frontStair">桩号较大</param> /// <returns></returns> /// <remarks>计算完成后,<param name="frontStair">成为下一阶段的<param name="backStair"></param></param></remarks> private LongitudinalStairExcav MergeSeperatedStair(LongitudinalStairExcav backStair, ref LongitudinalStairExcav frontStair) { var dist = frontStair.StartStation - backStair.EndStation; if (dist < _criterion.最小区间宽度) { // 合并两个区间 frontStair = new LongitudinalStairExcav(backStair.StartStation, frontStair.EndStation, backStair.StairArea + frontStair.StairArea); return(null); } else { // 如果后面台阶宽度小于10m,则删除,否则作为一个单独的区间提取出来 if (backStair.GetLength() < _criterion.最小区间宽度) { return(null); } else { // 说明此部分工程量不能忽略 return(backStair); } } }
/// <summary> /// 计算一段填方区间(填方段的两个边界交点之间的区间)的挖台阶量 /// </summary> /// <param name="startStation"></param> /// <param name="endStation"></param> private List <LongitudinalStairExcav> CalculateFillRange(double startStation, double endStation) { if (endStation - startStation < _criterion.最小区间宽度) { return(null); } // 求分段交点(集合中至少有两个值) var xy = new List <double[]>(); for (double x = startStation; x < endStation; x += _criterion.台阶宽度) { var intersVerticalGround = new CurveCurveIntersector2d(_longitudinalSection.GroundCurve2d, new Line2d(new Point2d(x, 0), new Vector2d(0, 1))); xy.Add(new double[] { x, intersVerticalGround.GetIntersectionPoint(0).Y }); } var stairsInFillZone = new List <LongitudinalStairExcav>(); // 计算此区间内所有坡度较陡的台阶 for (int i = 0; i < xy.Count - 1; i++) { var ratio = Math.Abs((xy[i + 1][1] - xy[i][1]) / ((xy[i + 1][0] - xy[i][0]))); if (ratio > _criterion.临界纵坡) { // 挖台阶的三角形面积 var area = Math.Abs((xy[i + 1][0] - xy[i][0]) * (xy[i + 1][1] - xy[i][1])) / 2; stairsInFillZone.Add(new LongitudinalStairExcav(xy[i][0], xy[i + 1][0], stairArea: area)); } } // 这里为了避免区间太密,作出一个强制处理:对同一个填方桩号区间内的所有满足条件的台阶区间进行合并,保证合并后的每一个区间的长度不小于设定的最小宽度 // 但是处理之后,总的挖台阶面积还是此区间内有效的台阶的三角形面积之和 int count = stairsInFillZone.Count; if (count == 0 || stairsInFillZone[count - 1].EndStation - stairsInFillZone[0].StartStation < _criterion.最小区间宽度) { // 表示此填方区间内,所有的台阶(算上分离的)之间的距离都小于 10 m,此时认为不作挖台阶处理 return(null); } else { var stairsInFillZone1 = new List <LongitudinalStairExcav>(); // 将一些分离的台阶进行合并,确保其距离不小于10m;但是处理之后,总的挖台阶面积还是此区间内有效的台阶的三角形面积之和 // 1. 将直接相连的台阶进行合并 var lastStair = stairsInFillZone[0]; LongitudinalStairExcav thisStair; stairsInFillZone1.Add(lastStair); for (int i = 1; i < count; i++) { thisStair = stairsInFillZone[i]; if (lastStair.IsMergeable(thisStair)) { lastStair.Merge(thisStair); } else { lastStair = thisStair; stairsInFillZone1.Add(thisStair); } } // 合并后,整个填方区间内,剩下相互分离的多个台阶子区间 // 2. 对于初步合并后自身宽度不足10m,左右10m内又没有其他台阶的项,直接删除 count = stairsInFillZone1.Count; if (count == 1) { // 如果合并后只剩一段,则直接返回 return(stairsInFillZone1); } else { // 从小桩号往大桩号前进式合并 stairsInFillZone = new List <LongitudinalStairExcav>(); LongitudinalStairExcav validatedStair; LongitudinalStairExcav backStair = stairsInFillZone1[0]; LongitudinalStairExcav frontStair = stairsInFillZone1[1]; // 整个填方段起码有三段分离的台阶子区间 for (int i = 0; i < count - 1; i++) { frontStair = stairsInFillZone1[i + 1]; validatedStair = MergeSeperatedStair(backStair, ref frontStair); if (validatedStair != null) { stairsInFillZone.Add(validatedStair); } backStair = frontStair; } // 最后一个子区间 if (frontStair.GetLength() >= _criterion.最小区间宽度) { stairsInFillZone.Add(frontStair); } return(stairsInFillZone); } } }