1、 /计算缓直点y坐标的函数double JSHYx(double lo,double R,double fwj,char zyp,double x);/计算缓圆点x坐标的函数double JSHYy(double lo,double R,double fwj,char zyp,double y);/计算缓圆点y坐标的函数double JSYHx(double lo,double R,double fwj,char zyp,double x);/计算圆缓点x坐标的函数double JSYHy(double lo,double R,double fwj,char zyp,double y);/计算
2、圆缓点y坐标的函数void JSQZZB(double x,double y,double fwj,double L,double R,double lo,double m,double p,char zyp,double *qzx,double *qzy); /计算曲中点坐标的函数void JSZZZB(double LC,int i,double *zbx,double *zby); /里程转坐标的函数1.1.2 编程流程图1.1.3 定义交点数据结构体本文将交点的数据存储于结构体中,结构体的定义如下:struct JDDATAdouble x; /交点的x坐标double y;/交点的y
3、坐标double R;/交点的半径double lo;/交点的缓长double fwj;/交点到下一个交点连线的方位角double p;/交点的内移距double m;/交点的切垂距char zyp;/交点的左右偏(左偏记为L,右偏记为R)double alpha;/交点的double T;/交点的切线长double L;/交点的曲线长double E;/交点的外矢距double KZH;/交点的直缓点里程double KHY;/交点的缓圆点里程double KYH;/交点的圆缓点里程double KHZ;/交点的缓直点里程double KQZ;/交点的曲中点里程double ZHx;/直缓点
4、的x坐标double ZHy;/直缓点的y坐标double HZx;/缓直点的x坐标double HZy;/缓直点的y坐标double HYx;/缓圆点的x坐标double HYy;/缓圆点的y坐标double YHx;/圆缓点的x坐标double YHy;/圆缓点的y坐标double QZx;/曲中点的x坐标double QZy;/曲中点的y坐标jd20;设计线路中有数个交点,故把每个交点的数据存储于结构体数组中,每个个体又包含如上列举的共性属性。本程序是用的是一个静态数组jd20,考虑到交点数据不是很多,故把容量暂定为20个,但是较有局限性,需要根据实际情况反复地改写程序。期望的改进方法是
5、使用动态数组或者是Carray,使得程序能够随着实际情况动态的提供数组容量,以节省需要的内存空间,但是现下能力有限,在尝试的过程中程序报错,不知如何修改,所以最终还是选用了静态数组。1.1.4 交点数据的读入以本选题所设计的昌吉赣客专横岗江家段线路为例,将交点数据存储在”JD.data.txt”中,如图:第一行的数据代表的是起始点的里程,以下每行的数据分别代表的是各个交点的纬度坐标、经度坐标、圆曲线长度、缓和曲线长度。利用文件流将数据读入。ifstream input;input.open(JDdata.txt); if (input.fail() /判断文件读取是否正常 coutjd0.KZ
6、H;int i=0;while (!input.eof()jdi.xjdi.yjdi.Rjdi.lo; /将交点数据存放于结构体中 i+;共检测到i0)fwj=0;else if (dx0&fwj=atan(dx/dy)*180/PI;dy=0)fwj=90;dyfwj=atan(dx/dy)*180/PI+180;else if (dx=0&fwj=180;else if (dxfwj=270;fwj=atan(dx/dy)*180/PI+360;return fwj;计算方位角函数的调用:for (int n=0;ni-1;n+)jdn.fwj=JSFWJ(jdn.x,jdn.y,jdn+
7、1.x,jdn+1.y);利用循环语句将交点的方位角都计算了出来。此外,本文中默认的一个交点的方位角是该交点到下一个交点连线的方位角。(2)转向角转向角是相邻两个方位角之差,并取绝对值。计算转向角函数的定义:double JSalpha(double fwj1,double fwj2)if (fabs(fwj2-fwj1)180) alpha=fabs(fwj2-fwj1);else alpha=360-fabs(fwj2-fwj1);return alpha;计算转向角函数的调用:jdcount.alpha=JSalpha(jdcount-1.fwj,jdcount.fwj);其中count
8、是循环语句的计数器,以下内容的计算都用到的循环的思想,在下文就不再赘述。(3)判断左右偏一般来说,但是若前方位角角度较小,接近0度,后方位角较大,接近360度,虽然后方位角大于前方位角,但实际偏转应当是左偏。所以本文中对这一情况进行了判断,由于本文是实际线路为例,考虑到实际线路转角偏转不会太大,故以180度为判断界限,若差值小于180,则按正常计算方法进行计算;若差值大于180,则应认为是出现了上述的特殊情况,则不能按一般情况进行计算判断左右偏函数的定义:char JSZYP(double fwj1,double fwj2)char turn;if (abs(fwj2-fwj1)fwj1)tu
9、rn=R;else turn=Lif(fwj2return turn;判断左右偏函数的调用:jdcount.zyp=JSZYP(jdcount-1.fwj,jdcount.fwj);(4)曲线要素根据实际情况,选定线路的交点,在符合规范的条件下,选定合适的半径和缓和曲线长度,根据以下公式进行计算:(4-2)(4-3)(4-4)(4-5)(4-6)(4-7)式中:p为内移距,m为切垂距,为缓和曲线角,T为切线长,L为曲线长,E为内移距。特征点里程的计算:ZH点里程为上一点HZ点里程加两个交点的距离减去两个交点的切线长。(其中交点0的HZ点里程按起始点里程算,切线长认为是0)HY点里程=ZH(里程
10、)+YH点里程= ZH(里程)+-HZ点里程= ZH(里程)+QZ点里程= ZH(里程)+2;曲线要素计算的部分,程序内容比较简单,就是定义一个函数,然后在主函数中调用它,得到需要的结果。详细程序请参见附录。1.1.6 逐桩坐标的计算这里的逐桩坐标的计算,其实就是给出任意点的里程,要能计算出这个点的坐标。由于整条线路比较长,故选10米为一个点,也就是计算10米桩的坐标。大致的思路是这样的:一、得到一个点的里程,判断它落在哪一部分的曲线上(直线、圆曲线还是缓和曲线),不同的曲线部分计算的方法有所不同;二、计算得到局部坐标。三、利用坐标转换原理得到整体坐标。在直线段部分,坐标的计算比较简单,利用方
11、位角和里程差就能轻松求得。在缓和曲线段和圆曲线段,需要用到切线支距法,以夹直线所在直线为x轴,垂直夹直线所在直线的直线为y轴计算公式:(1)缓和曲线部分(4-8)(4-9)(2)圆曲线部分(4-10)(4-11)(4-12)相应的,后缓和曲线则以HZ点为坐标原点用切线支距法进行计算。(3)局部坐标转换为整体坐标转换公式如下:(4-13)需要注意的是,由于左偏还是右偏对局部坐标的计算是有影响的,所以在计算前应根据不同的左右偏情况分情况进行讨论计算,再根据具体的情况判断局部坐标系下x,y的正负,保证计算的正确。(4)逐桩坐标数据结构struct randompointdouble LC;point
12、4000;这里用到的也是结构体的思想,把任意点的x坐标,y坐标和里程都放到结构体里面去。逐桩坐标计算程序定义如下:void JSZZZB(double LC,int i,double *zbx,double *zby)for (int count2=1;count2=jdcount2-1.KHZ&LC=jdcount2.KZH&=jdcount2.KHY) /前缓段double l=LC-jdcount2.KZH;double hyx=l-pow(l,5)/40/pow(jdcount2.R,2)/pow(jdcount2.lo,2);double hyy;if (jdcount2.zyp=)
13、hyy=pow(l,3)/6/jdcount2.R/jdcount2.lo;elsehyy=-pow(l,3)/6/jdcount2.R/jdcount2.lo;*zbx=jdcount2.ZHx+hyx*sin(jdcount2-1.fwj*PI/180)-hyy*cos(jdcount2-1.fwj*PI/180);*zby=jdcount2.ZHy+hyx*cos(jdcount2-1.fwj*PI/180)+hyy*sin(jdcount2-1.fwj*PI/180);=jdcount2.KHY&jdcount2.KYH)/圆曲线段 double Qalfa=(l-jdcount2.l
14、o)*180/PI/jdcount2.R+jdcount2.lo*180/2/PI/jdcount2.R; double qx=jdcount2.R*sin(Qalfa*PI/180)+jdcount2.m;double qy;qy=jdcount2.R*(1-cos(Qalfa*PI/180)+jdcount2.p;qy=-(jdcount2.R*(1-cos(Qalfa*PI/180)+jdcount2.p); *zbx=jdcount2.ZHx+qx*sin(jdcount2-1.fwj*PI/180)-qy*cos(jdcount2-1.fwj*PI/180);*zby=jdcount
15、2.ZHy+qx*cos(jdcount2-1.fwj*PI/180)+qy*sin(jdcount2-1.fwj*PI/180);=jdcount2.KYH&jdcount2.KHZ)/后缓段double l=jdcount2.KHZ-LC;double yhx=-(l-pow(l,5)/40/pow(jdcount2.R,2)/pow(jdcount2.lo,2);double yhy;yhy=pow(l,3)/6/jdcount2.R/jdcount2.lo;yhy=-pow(l,3)/6/jdcount2.R/jdcount2.lo; *zbx=jdcount2.HZx+yhx*sin
16、(jdcount2.fwj*PI/180)-yhy*cos(jdcount2.fwj*PI/180); *zby=jdcount2.HZy+yhx*cos(jdcount2.fwj*PI/180)+yhy*sin(jdcount2.fwj*PI/180); break;函数的调用如下:int num=jdi-1.KZH/10;(计算每10米一个点的总点位数)for (int j=0;jnum;j+)pointj.LC=jd0.KZH+10*j;JSZZZB(pointj.LC,i,&pointj.x,&pointj.y);这样就把每10米一个点的坐标给求出来了。1.1.7 特征点坐标特征点坐标
17、的计算同逐桩坐标点坐标的计算相同,只是将任意的里程替代为特征点的里程,用到的方法都是一样的,这里也就不一一赘述了。计算数据的输出这里依旧是用文件流的方法,将计算得到的数据读出到result.txt。output.open(for (int count1=1;count1count1+)int k1,k3,k5,k7;double k2,k4,k6,k8;k1=jdcount1.KZH/1000;k2=jdcount1.KZH-k1*1000;k3=jdcount1.KHY/1000;k4=jdcount1.KHY-k3*1000;k5=jdcount1.KYH/1000;k6=jdcount1
18、.KYH-k5*1000;k7=jdcount1.KHZ/1000;k8=jdcount1.KHZ-k7*1000;outputalpha=jdcount1.alpha T=jdcount1.TL=jdcount1.L直缓点里程=Kk1+k2缓圆点里程=k3k4圆缓点里程=k5k6缓直点里程=k7k8 /输出特征点的里程 output直缓点x坐标=jdcount1.ZHx直缓点y坐标=jdcount1.ZHy缓圆点x坐标=jdcount1.HYx缓圆点y坐标=jdcount1.HYy圆缓点x坐标=jdcount1.YHx圆缓点y坐标=jdcount1.YHy缓直点x坐标=jdcount1.HZ
19、x缓直点y坐标=jdcount1.HZy /输出特征点坐标jdi-1.KZH=jdi-2.KHZ+sqrt(jdi-1.x-jdi-2.x)*(jdi-1.x-jdi-2.x)+(jdi-1.y-jdi-2.y)*(jdi-1.y-jdi-2.y);int k1;int k2;任意点里程setw(10)x坐标setw(20)y坐标k1=pointj.LC/1000;k2=pointj.LC-k1*1000;pointj.xsetw(15)pointj.y /输出逐桩里程及坐标output.close();如下图所示,就是程序运行后输出文件”result.txt”的结果显示曲线要素计算程序代码#include fstreamstdlib.hcmathiomanipusing namespace std;const double PI=3.14159;/声明计算方位角的函数/声明计算内移距p的函数/声明计算切垂距m的函数/声明判断左右偏函数/声明计算的函数/声明计算切线长的函数/声明计算曲线长的函数/声明计算外矢距的函数double JSKZH(double K,
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1