您好,欢迎访问三七文档
当前位置:首页 > 高等教育 > 其它文档 > 中南大学土木工程软件课程设计
基于C++编写线路CAD程序1.1曲线要素计算程序1.1.1主要内容和计算函数(1)计算内容:在txt文件中读取交点信息,编程计算线路曲线要素、特征点里程及坐标、逐桩里程和坐标,并读出到txt文件。(2)计算函数:structJDDATA//定义交点数据结构体structrandompoint//定义任意点坐标数据结构doubleJSFWJ(doublex1,doublex2,doubley1,doubley2);//计算方位角的函数doubleJSp(doublelo,doubleR);//计算内移距p的函数doubleJSm(doublelo);//计算切垂距m的函数charJSZYP(doublefwj1,doublefwj2);//判断左右偏函数(其中左偏记为”L”,右偏记为”R”)doubleJSalpha(doublefwj1,doublefwj2);//计算α的函数doubleJST(doubleR,doublep,doublem,doublealpha);//计算切线长的函数doubleJSL(doubleR,doublelo,doublealpha);//计算曲线长的函数doubleJSE(doubleR,doublep,doublealpha);//计算外矢距的函数doubleJSKZH(doubleK,doublex1,doubley1,doublex2,doubley2,doubleT1,doubleT2);//计算直缓点里程的函数doubleJSKHY(doubleKZH,doublelo);//计算缓圆点里程的函数doubleJSKYH(doubleKZH,doubleL,doublelo);//计算圆缓点里程的函数doubleJSKHZ(doubleKZH,doubleL);//计算缓直点里程的函数doubleJSKQZ(doubleKZH,doubleL);//计算曲中点里程的函数doubleJSZHx(doublex,doublefwj,doubleT);//计算直缓点x坐标的函数doubleJSZHy(doubley,doublefwj,doubleT);//计算直缓点y坐标的函数doubleJSHZx(doublex,doublefwj,doubleT);//计算缓直点x坐标的函数doubleJSHZy(doubley,doublefwj,doubleT);//计算缓直点y坐标的函数doubleJSHYx(doublelo,doubleR,doublefwj,charzyp,doublex);//计算缓圆点x坐标的函数doubleJSHYy(doublelo,doubleR,doublefwj,charzyp,doubley);//计算缓圆点y坐标的函数doubleJSYHx(doublelo,doubleR,doublefwj,charzyp,doublex);//计算圆缓点x坐标的函数doubleJSYHy(doublelo,doubleR,doublefwj,charzyp,doubley);//计算圆缓点y坐标的函数voidJSQZZB(doublex,doubley,doublefwj,doubleL,doubleR,doublelo,doublem,doublep,charzyp,double*qzx,double*qzy);//计算曲中点坐标的函数voidJSZZZB(doubleLC,inti,double*zbx,double*zby);//里程转坐标的函数1.1.2编程流程图1.1.3定义交点数据结构体本文将交点的数据存储于结构体中,结构体的定义如下:structJDDATA{doublex;doublex;//交点的x坐标doubley;//交点的y坐标doubleR;//交点的半径doublelo;//交点的缓长读取交点文件JDdata.txt计算曲线要素计算特征点里程计算特征点坐标计算逐桩坐标读出数据到文件result.txtdoublefwj;//交点到下一个交点连线的方位角doublep;//交点的内移距doublem;//交点的切垂距charzyp;//交点的左右偏(左偏记为L,右偏记为R)doublealpha;//交点的αdoubleT;//交点的切线长doubleL;//交点的曲线长doubleE;//交点的外矢距doubleKZH;//交点的直缓点里程doubleKHY;//交点的缓圆点里程doubleKYH;//交点的圆缓点里程doubleKHZ;//交点的缓直点里程doubleKQZ;//交点的曲中点里程doubleZHx;//直缓点的x坐标doubleZHy;//直缓点的y坐标doubleHZx;//缓直点的x坐标doubleHZy;//缓直点的y坐标doubleHYx;//缓圆点的x坐标doubleHYy;//缓圆点的y坐标doubleYHx;//圆缓点的x坐标doubleYHy;//圆缓点的y坐标doubleQZx;//曲中点的x坐标doubleQZy;//曲中点的y坐标}jd[20];设计线路中有数个交点,故把每个交点的数据存储于结构体数组中,每个个体又包含如上列举的共性属性。本程序是用的是一个静态数组jd[20],考虑到交点数据不是很多,故把容量暂定为20个,但是较有局限性,需要根据实际情况反复地改写程序。期望的改进方法是使用动态数组vector或者是Carray,使得程序能够随着实际情况动态的提供数组容量,以节省需要的内存空间,但是现下能力有限,在尝试的过程中程序报错,不知如何修改,所以最终还是选用了静态数组。1.1.4交点数据的读入以本选题所设计的昌吉赣客专横岗—江家段线路为例,将交点数据存储在”JD.data.txt”中,如图:第一行的数据代表的是起始点的里程,以下每行的数据分别代表的是各个交点的纬度坐标、经度坐标、圆曲线长度、缓和曲线长度。利用文件流将数据读入。ifstreaminput;input.open(JDdata.txt);if(input.fail())//判断文件读取是否正常{coutFiledoesnotexistendl;coutExitprogramendl;}inputjd[0].KZH;inti=0;while(!input.eof()){inputjd[i].xjd[i].yjd[i].Rjd[i].lo;//将交点数据存放于结构体中i++;}cout共检测到i个交点endl;input.close();这一部分程序运行完之后,会出现一个对话框,读取到的交点个数会显示到对话框上,而相应的交点数据已经存入到结构体当中去了。1.1.5曲线要素计算原理及程序的实现(1)方位角计算方位角需要用到两个交点的坐标数据。对于不同象限的方位角,所对应的计算方法也会有所不同。如下程序首先判断方位角在哪一个象限,再根据判断的结果进行方位角的计算。现已在第一象限为例,对计算原理进行阐释:0101y-yx-xatanfwj(4-1)计算方位角函数的定义:doubleJSFWJ(doublex1,doubley1,doublex2,doubley2){doublefwj;y(x1,y1)xfwjdoubledx;doubledy;dx=x2-x1;dy=y2-y1;if(dx==0&&dy0)fwj=0;elseif(dx0&&dy0)fwj=atan(dx/dy)*180/PI;elseif(dx0&&dy==0)fwj=90;elseif(dx0&&dy0)fwj=atan(dx/dy)*180/PI+180;elseif(dx==0&&dy0)fwj=180;elseif(dx0&&dy0)fwj=atan(dx/dy)*180/PI+180;elseif(dx0&&dy==0)fwj=270;elseif(dx0&&dy0)fwj=atan(dx/dy)*180/PI+360;returnfwj;}计算方位角函数的调用:for(intn=0;ni-1;n++){jd[n].fwj=JSFWJ(jd[n].x,jd[n].y,jd[n+1].x,jd[n+1].y);}利用循环语句将交点的方位角都计算了出来。此外,本文中默认的一个交点的方位角是该交点到下一个交点连线的方位角。(2)转向角转向角是相邻两个方位角之差,并取绝对值。计算转向角函数的定义:doubleJSalpha(doublefwj1,doublefwj2){doublealpha;if(fabs(fwj2-fwj1)180){alpha=fabs(fwj2-fwj1);}else{alpha=360-fabs(fwj2-fwj1);}returnalpha;计算转向角函数的调用:jd[count].alpha=JSalpha(jd[count-1].fwj,jd[count].fwj);其中count是循环语句的计数器,以下内容的计算都用到的循环的思想,在下文就不再赘述。(3)判断左右偏一般来说,但是若前方位角角度较小,接近0度,后方位角较大,接近360度,虽然后方位角大于前方位角,但实际偏转应当是左偏。所以本文中对这一情况进行了判断,由于本文是实际线路为例,考虑到实际线路转角偏转不会太大,故以180度为判断界限,若差值小于180,则按正常计算方法进行计算;若差值大于180,则应认为是出现了上述的特殊情况,则不能按一般情况进行计算判断左右偏函数的定义:charJSZYP(doublefwj1,doublefwj2){charturn;if(abs(fwj2-fwj1)=180){if(fwj2fwj1)turn='R';elseturn='L';}else{if(fwj2fwj1)turn='L';elseturn='R';}returnturn;判断左右偏函数的调用:jd[count].zyp=JSZYP(jd[count-1].fwj,jd[count].fwj);(4)曲线要素根据实际情况,选定线路的交点,在符合规范的条件下,选定合适的半径和缓和曲线长度,根据以下公式进行计算:2l0m(4-2)Rp24l20(4-3)R2l18000(4-4)mpRT2tan)((4-5)RpRE2sec)((4-6)0180lRL(4-7)式中:p为内移距,m为切垂距,0为缓和曲线角,T为切线长,L为曲线长,E为内移距。特征点里程的计算:ZH点里程为上一点HZ点里程加两个交点的距离减去两个交点的切线长。(其中交点0的HZ点里程按起始点里程算,切线长认为是0)HY点里程=ZH(里程)+0l;YH点里程=ZH(里程)+L-0l;HZ点里程=ZH(里程)+L;QZ点里程=ZH(里程)+L÷2;曲线要素计算的部分,程序内容比较简单,就是定义一个函数,然后在主函数中调用它,得到需要的结果。详细程序请参见附录。1.1.6逐桩坐标的计算这里的逐桩坐标的计算,其实就是给出任意点的里程,要能计算出这个点的坐标。由于整条线路比较长,故选10米为一个点,也就是计算10米桩的坐标。大致的思路是这样的:一、得到一个点的里程,判断它落在哪一部分的曲线上(直线、圆曲线还是缓和曲线),不同的曲线部分计算的方法有所不同;二、计算得到局部坐标。三、利用坐标转换原理得到整体坐标。在直线段部分,坐标的计算比较简单,利用方位角和里程差就能轻松求得。在缓和曲线段和圆曲线段,需要用到切线支距法,以夹直线所在直线为x轴,垂直夹直线所在直线的直线为y轴计算公式:(1)缓和曲线部分202540lRllx(4-8)036Rlly(4-9)(2)圆曲线部分0011180i)cos1(sinRllpRymRx(4-10)(4-11)(4-12)相应的,后缓和曲线则以HZ点为坐标原点用切线支距法进行计算。(3)局部坐标转换为整体坐标转换
本文标题:中南大学土木工程软件课程设计
链接地址:https://www.777doc.com/doc-5445591 .html