5800线元法(积木法)匝道坐标正反算放样程序
(歪哥版权 2009)
本程序由一个主程序2.XY和两个子程序(XY-A、XY-B)构成及各个线路的线元矩阵数据库(如P.Z、P.A等)组成,运行时只需运行主程序即可!
本程序采用复化辛普森公式为核心,采用积木法线元定位思路架构,多线路共存,程序开始选择线路后K Or –K To Shu?提示时,执行输入一个定位桩号用于定位所在线元(若为负值程序转化为手工输入单独一段线元的要素:将显示K0?KN?X0? Y0?F0?R0?RN?ZX:-1,+1,0?等单一线元要素的输入正算;注意此时目的只是为了紧接着的下一段线元起点桩号(也就是所输入线元的终点桩号)坐标起点切线方位角计算,为了编写数据库做准备用的,故此时手输入情形下程序只可单独正算不可进行反算的!!等用手工输入单算将所有线元数据准备完毕编写为数据库时即可任意角正反算的),后面的坐标正、反算均在该线元范围内进行,该线元要素只在程序开始时运行一次(其实线元要素的显示可根据半径值负号确定所输入桩号所在的线形转向等信息),避免了每次计算桩号都要重新定位线元、计算线元要素的麻烦,适当的提高了正反计算速度,虽然存在每次执行程序只能在一个线元计算范围内计算,要计算另一个线元范围的桩号,要重新执行程序的缺点,但比起由此带来的优势,这是微不足道的;其实当K OUT!提示时只需连续两次EXE重新定位即可计算!!
线元定位技术的采用,结合线元计算桩号范围的确定,可圆满解决公路匝道曲线中的断链情况;关于此程序断链的处理:断链前后的数据编写到一个数据库中,运行时只需记住断链前后某一个特定桩号来定位断链前后线元即可开始正常的断链前后的正反算了的。
数据库子程序采用矩阵变量的形式,使数据组织更加简洁,输入更加便捷;(全部数据库输入完毕后检查核对办法之一:逐一循环输入各个线元中的任一点桩号正算后彻底退出程序后,回到comp模式下按FUCTION----8:MATRIX-----1:EDIT----下箭头选择Mat B后回车用左右箭头键查看矩阵表中所输入该桩号所在的该段线元数据是否有误,有误则立即EXIT退出到线路数据库中找到该行修改[[]]中所错误的数值即可!!无误则可放心使用!)
程序考虑了调用数据库子程序和手工输入线元数据两种方法。
本程序采用线元定位思路故而专为应对匝道坐标计算而设,当然主线上的单交点平曲线计算也可使用的,但单交点曲线运用该程序计算的弊端是由于数据库太长占用计算器空间字节太多,故建议用交点法处理单交点曲线减少数据库容量,当然在单交点曲线线路中当不完整缓和曲线(含卵形)时,存在时此段不完整缓和曲线(含卵形)采用此线元法解决未尝不可!!
关于下面代码中字母O和数字0,分不清者建议到word中使用编辑---查找功能自己就可区分出来!!!
主程序名:
2.XY
ClrMat:Deg:Fix 3↙
Cls :"1Z 2A 3B"?→I ↙(注:此处""内为线路名,有几条线路就加入几条!)
Cls:"KOr –K To Shu"?K:If K≥0:Then↙
I=1=>Prog"P. Z"↙
I=2=>Prog"P. A"↙
I=3=>Prog"P. B"↙
………………………
(注:此处必须与上述""内为线路名和下面的数据库子程序名对应,有几条线路就加入几条!)
MatB[1,1]→A: Mat B[1,2]→L: Mat B[1,3]→U: Mat B[1,4]→V: Mat B[1,5]→W: Mat B[1,6]→P: Mat B[1,7]→Q: Mat B[1,8]→G↙
ElseCls:"K0"?A:"KN"?L :"X0"?U :"Y0"?V :"F0"?W :
"R0"?P :"RN"?Q:"ZX:-1,+1,0"?G:IfEnd :Cls↙
1→O:Prog "XY-B"↙
Cls:"1.ZS 2.FS"? →I: I=2=>Goto 3↙
Cls:"XC"?H:"YC"?Z↙
LbI 1 : Cls:"K×+×××"?K↙
If K>L Or K<A : Then Cls:Locate 6,2,"K OUT !"◢
Stop: IfEnd↙
LbI 2: Cls:90→B: Cls:"RJ Or 0 To K"?B:B=0 =>Goto 1:"Z"?T↙
Prog "XY-A"↙
X+Tcos(M+B)→X↙
Y+Tsin(M+B)→Y↙
360Frac((M+360)÷360→M↙
Pol(X-H,Y-Z : 360Frac((J+360)÷360→J↙
2→O:Prog "XY-B":Goto 2↙
LbI 3 : Cls: "X"?C:"Y"?D↙
LbI 4 : If K>L Or K<A : Then Cls: Locate 6,2,"K OUT !"◢
Stop:IfEnd↙
Prog "XY-A"↙
(D-Y)sin(M)+(C-X)cos(M)→H↙
If
Abs(H)>X10-3 :Then
K+H→K:Goto 4:IfEnd↙
(D-Y)÷cos(M)→T↙
3→O:Prog "XY-B":Goto 3↙
子程序1名: XY-A
5→N:G(Q-1-P-1)÷Abs(L-A)→F: Abs(K-A)÷N→R: 90R÷π→S:
W+(FNR+2GP-1)NS→M:1→E↙
U+R÷6×(Cos (W)+Cos (M) +4∑(Cos (W+((E+0.5)FR+2GP-1)×(E+0.5)S),E,0,(N-1))+2∑(Cos (W+((EFR+2GP-1)ES,E,1,(N-1)))→X ↙
V+R÷6×(sin (W)+sin (M) +4∑(sin (W+((E+0.5)FR+2GP-1)×(E+0.5)S),E,0,(N-1))+2∑(sin (W+((EFR+2GP-1)ES,E,1,(N-1)))→Y↙
子程序2名: XY-B
Cls:Fix 3:If O=1:Then "XY RESULTS:": "K0=":"KN=":
"F0=": Locate 5,2,A : Locate5,3,L : Locate 5,4,W◢
Cls :"X0=":"Y0=":"R0=":"RN=": Locate 5,1,U: Locate 5,2,V : Locate 5,3,GP : Locate 5,4,GQ◢
IfEnd↙
IfO=2:Then↙
Cls :"K×××=":"Z=":"X=":"Y=": Locate 6,1, K: Locate 4, 2, T : Locate 4,3, X : Locate 4,4, Y◢
If T=0 :Then Cls :"QF(Z)=": Locate 8,1, M:M▼DMS◢
IfEnd↙
Cls :"K×××=":"S=": Locate 6,1, K : Locate 4, 2, I :
"F=":J:J▼DMS◢
IfEnd↙
If
O=3:Then "X=":"Y=":"K×××=":"Z=": Locate 4,1,C: Locate 4, 2, D : Locate
6,3,K :Locate 4,4,T◢
IfEnd:Cls↙
线路线元数据库子程序格式:
数据库采用给矩阵变量Mat B赋值的形式,使数据组织更加简洁,极大的减少了线路数据库子程序的输入量,节约了计算器空间
程序说明:
程序线元判断原则:
(1) 以道路中线的前进方向(即里程增大的方向)区分左右;
(2) 当所求点位于中线时,Z=0;当位于中线左侧时,Z取负值;当位于中线右侧时,Z取正值。
(3) 当线元为直线时,其起点、终点的曲率半径为无穷大,以10的45次代替输入×10x45。
(4) 当线元为圆曲线时,无论其起点、终点与什么线元相接,其曲率半径均等于圆弧的半径。
(5) 当线元为完整缓和曲线时,起点与直线相接时,曲率半径为无穷大,以10的45次代替输入×10x45;与圆曲线相接时,曲率半径等于圆曲线的半径。终点与直线相接时,曲率半径为无穷大,以10的45次代替输入×10x45;与圆曲线相接时,曲率半径等于圆曲线的半径。
(6) 当线元为非完整缓和曲线时,起点与直线相接时,曲率半径等于设计规定的值;与圆曲线相接时,曲率半径等于圆曲线的半径。终点与直线相接时,曲率半径等于设计规定的值;与圆曲线相接时,曲率半径等于圆曲线的半径。
输入与显示简单说明
1.ZS 2.FS选1正算 选2反算
K0? KN? R0? RN?F0?X0? Y0?ZX? 分别为线元起点桩号 、终点桩号、起点半径、终点半径、起点切线方位角、起点X坐标、起点Y坐标、线元转向。
XC ? YC? 输入置镜点即测站的X,Y坐标
K××+×××? 输入所求的桩号
Z ? 输入所求点距中线的边距(在中线输零,左负右正)
RJ? 输入边桩时左右边桩连线与线路前进方向中桩切线的右交角(当输入数字0时进入下一个桩号计算输入)
X =、Y
= 计算得出的所求点的左、中、右 的X Y坐标
QF(Z)=
××× 计算得出所求点的中桩切线方位角
F= ××× 计算得出置镜点到测点的方位角
S= ××× 计算得出置镜点到测点的水平距离
X=××× 反算输入所求点的X坐标
Y=××× 反算输入所求点的Y坐标
K=××× 计算得出求点所对应的里程
Z=××× 计算得出求点到所对应的里程的垂直距离 (负就是左边,正就是右边)
郑重声明: 提供一种编程解决断链的思路而已没啥技巧可言!
魏哥编制发布于2009-11 5800计算器程序代表作之一
保证源码完整计算无误! 转载复制请注明出处,原作者保留一切版权和解释权,不得擅自修改核心代码和程序结构,包含不会使用者代码输入错误等否则所造成的一切错误后果,作者将不承担任何责任!!
这个真不知道!