• ArcEngine下架空线之悬链线的模拟


    最近在做电力方面的东西,需要对架空线进行三维建模。经过前端时间的搜索与实践,最终实现了AE下悬链线的模拟。首先说明几个问题:

    (1)实地架设杆塔时,两个相邻杆塔的高程一般是不相同的,这就需要用到不等高悬点架空线的悬链线方程,在线路三维建模时要进行点位的判断

    (2)在计算悬链线高度时要进行三维空间XYZ到二维空间ZU的转换,这里的u坐标轴是杆塔连线在XY平面的投影,zu所在三维空间Z=低悬点的高程值。

    (3)采样精度设置为1。采样完成后将二维点再转换成三维点即可。

    这里用AE写了一个类,用于悬链线的生成,公式主要参考《架空输电线路设计- 孟遂民》这本书,没有考虑复杂的温度、风力、覆冰等条件。代码如下:

    /// <summary>
        /// 根据起点和终点生成悬链线
        /// 不等高悬点架空线方程
        /// 悬链线长度方程
        /// </summary>
        class PowerLineCreator
        {
            public IPoint FromPoint //起点
            { 
                get; 
                set;
            }
            public IPoint ToPoint   //终点
            { 
                get; 
                set; 
            }
    
            public double HorizontalStress  //弧垂最低点应力 (已知条件、水平应力)  σ0
            {
                get;
                set;
            }
    
            public int SampleAccuracy   //插值精度
            {
                get;
                set;
            }
            public double r    //比载:单位长度架空线上所受的荷载折算到单位载面积上的数值
            {
                get;
                set;
            }
    
            public double PlaneLength//悬链线档距
            {
                get
                {
                    double planelength_ = Math.Sqrt(Math.Pow(FromPoint.X - ToPoint.X,2) + Math.Pow(FromPoint.Y - ToPoint.Y,2));
                    return planelength_;
                }
                
            }
    
            public double L  //不等高悬点架空线长度
            {
                get
                {
                    return Math.Sqrt(Math.Pow(L_h0,2) + Math.Pow(H,2));
                }
            }
            public double H //   悬点高程差
            {
                get 
                {
                    return Math.Abs(FromPoint.Z - ToPoint.Z);    
                }      
            }
    
            public double L_h0  //等高悬点架空线的档内悬链线长度
            {
                get
                {
                    double L = 2 * HorizontalStress / r * Math.Sinh(r * PlaneLength / (2 * HorizontalStress));
                    return L;
                }
            }
    
            public double a   //低悬点至弧垂最低点的水平距离 
            {
                get
                {
                    return PlaneLength / 2 - HorizontalStress / r * SpecialFunction.asinh(H / L_h0);
                }
            }
    
            public double b  //弧垂最低点至高悬点的水平距离
            {
                get
                {
                    return L_h0 - a;
                }
            }
    
            public PowerLineCreator ()
            {
                
            }
            /// <summary>
            /// 悬链线方程
            /// </summary>
            /// <param name="u">二维空间下u坐标</param>
            /// <returns>悬链线高度</returns>
            public double Get_Z (double u) 
            {
                double Z = H / L_h0 * (2 * HorizontalStress / r * Math.Sinh(r * u / 2 / HorizontalStress) * Math.Cosh(r * (L_h0 - u) / 2 / HorizontalStress)) -
                    Math.Sqrt(1 + Math.Pow(H / L_h0,2)) * 2 * HorizontalStress / r * Math.Sinh(r * u / 2 / HorizontalStress) * Math.Sinh(r * (L_h0 - u) / 2 / HorizontalStress);
                return Z;
            }
            /// <summary>
            /// 根据起始点生成悬链线插值点
            /// </summary>
            /// <returns></returns>
            public IPointCollection CreateLinePoints ()
            {
                IPointCollection ptCollection = new PolylineClass();
                ILine line_ = new LineClass();
                line_.PutCoords(FromPoint,ToPoint);
                double pAngle = line_.Angle;
                //采样悬链线点
                for(int i = 0;i < PlaneLength-1;i+=SampleAccuracy)
                {
                    //二、三维空间坐标的转换
                    IPoint point_ = new PointClass();
                    (point_ as IZAware).ZAware = true;
                    point_.X = FromPoint.X + i * Math.Cos(pAngle);
                    point_.Y = FromPoint.Y + i * Math.Sin(pAngle);
                    point_.Z = FromPoint.Z + Get_Z(i);
                    ptCollection.AddPoint(point_);
    
                }
                ptCollection.AddPoint(ToPoint);
                
                return ptCollection;
            }
    
        }

    最终实现效果图:

    转载请注明出处:http://blog.csdn.net/liushuo_whu/article/details/21323807谢谢!

  • 相关阅读:
    在ASP.NET中把数据POST到其他页面
    在网页中使用javascript打开没有最大化、最小化和关闭按钮的窗口
    怎么找回被删并清空了回收站的文件
    域控制器的安装步骤二——把客户机加入到域
    升级和卸载域AD:实现域网络管理二
    不用设置BIOS,也能让光驱启动电脑!
    老版(旧版)封神榜片头,片尾曲
    域控制器的安装步骤一
    SEO面试试题
    如何将客户机添加到域?
  • 原文地址:https://www.cnblogs.com/giser-whu/p/3707042.html
Copyright © 2020-2023  润新知