最近在做电力方面的东西,需要对架空线进行三维建模。经过前端时间的搜索与实践,最终实现了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谢谢!