Esempio n. 1
0
        /// <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);
                }
            }
        }
Esempio n. 2
0
        /// <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);
                }
            }
        }