zoukankan      html  css  js  c++  java
  • 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谢谢!

  • 相关阅读:
    python中的编码问题
    CVPR2018 Tutorial 之 Visual Recognition and Beyond
    hdu 1376 Octal Fractions
    hdu 1329 Hanoi Tower Troubles Again!
    hdu 1309 Loansome Car Buyer
    hdu 1333 Smith Numbers
    hdu 1288 Hat's Tea
    hdu 1284 钱币兑换问题
    hdu 1275 两车追及或相遇问题
    hdu 1270 小希的数表
  • 原文地址:https://www.cnblogs.com/giser-whu/p/3707042.html
Copyright © 2011-2022 走看看