经苦心钻研,奋战多日,终于编写出了代码短,速度快,精度高,功能全的线路坐标正反算程序,欢迎试用并提出宝贵意见。
功能简介及特点:1、选用高斯-勒让德公式作计算内核,保证精度,模块化设计,便于扩充功能。
2、线元数据可自动从数据库调用,也可手工输入。
3、可管理多条线路,如里程不在线路或线元范围,将警告里程偏大、偏小。
4、边桩计算设计为导线式递推方式,可用于由一个中桩推出结构物所有角点坐标。
5、反算实现了智能化操作,只需输入线路号(或手工输线元资料)、坐标,不需近似里程,即可自动从起点向后开始试算出里程、位置,如对算出里程、位置表示怀疑,还可以让计算器从终点起再向前试算下一个可能的位置(匝道、回头曲线同一坐标可能会有一个以上结果)。
第三次及以后试算才要求输入近似里程。
6、程序代码规范简洁,便于阅读、理解。
完整程序清单:ZFS %正反算主程序B=.1739274226:C=.5-B:Lbl 1:U"0 ZS 1 FS"=0=>Prog "ZS":≠>U=1=>Prog"FS":≠>Goto 1ZS %正算子程序{K}:Prog"ZZ":I=0:{I}:I"L"≠0=>"Prog"WY":≠>Prog"ZB"FS %反算子程序{KVW}:V"XC"W"YC":Lbl 2:Prog "ZZ":I=V-S:J=W-T:Pol(I,J: J=J-F:K=K+Rec(I,J:AbsI<1m=>Prog"WZ":≠>Goto 2ΔM=0:{M}:M"0 NEXT"=0=>U=U+1:Goto 2:≠>U=1ZZ %高斯法中桩子程序(4节点)Prog"XL":M=K-L:O=(P-R)÷2PQR:D=.0694318442:E=.3300094782:F=1:G=1-E:H=1-D:I=5:Lbl 1:C[I]=A+MrC[I](1÷P+OMC[I]:Dsz I:Goto 1:S=X+M(BcosD+CcosE+CcosG+BcosH:T=Y+M(BsinD+CsinE+CsinG+BsinHWY %外移点计算子程序Lbl 1:J=90:{J}:J=F+J"<":F=J:S=S+Rec(I,J:T=T+J: Prog"ZB":I=0:{I}:I"L"≠0=>Goto 1WZ %位置显示子程序"KJ":K:Pause 1:J◢ZB %坐标显示子程序"XY":S:Pause 1:T◢YC %异常处理子程序U=1=>K=L:U=2ΔU=3=>K=M:U=4ΔU=5=>{K}:U=4ΔK<L=>"<<!":Z=1ΔK>M=>">>!":Z=1DL %断链处理子程序"DL":K=L:I>0=>K=L+Q-------------------------以上为程序运算部分,以下为数据库部分-------------------------------XL %线路数据库选择子程序Lbl 1:Z=0:N"0 SD"=0=>Prog"0"△N=1=>Prog"1"△N=2=>Prog"2"△...有几条线路仿上行格式输几行Z=1=>{NLXYOPQRK}:Goto 10 %手工输入子程序L"K0"XYAQ"LS"P"R0"R"RN":M=L+Q:Prog"YC"1 %线路一数据库子程序①Lbl B:L=线路起点里程:M=线路终点里程:Prog"YC":Z=1=>Goto EΔ②Q=线元长:P=起点半径:R=终点半径:K≤L+Q=>X=起点X坐标:Y=起点Y坐标:A=起点方位角:Goto EΔL=L+Q:③......④Q=短链长:K<L+Q=>Prog "DL":Goto BΔL=L+Q:⑤Q=线元长:P=起点半径:R=终点半径:K≤L+Q=>X=起点X坐标:Y=起点Y坐标:A=起点方位角:Goto EΔL=L+Q:⑥......⑦Q=线元长:P=起点半径:R=终点半径:X=起点X坐标:Y=起点Y坐标:A=起点方位角:Lbl E2 %线路二数据库子程序输入要求和线路一相同。
数据输入要求:①是线路总体资料格式②⑤是标准线元资料格式,按里程顺序依次排④断链资料格式⑦最后一个线元资料格式注:1、加下划线的行是程序名及功能说明2、ZZ程序第三行的r是计算器的弧度转度标志,相当于*180/π。
3、请注意区别数字0及字母O每个子程序第一行为程序名和功能简介用%隔开,本程序语句在行未统一用冒号分隔,不须再加换行符,除≠>前外所有冒号也可用换行代替。
程序未尾的Δ(一个程序中Δ个数本应和=>的个数相等)、:前的)]、小数点前的0可省略,不影响程序运行结果,省略乘号的连乘运算优先级高于除法。
==================================================== =====================================程序使用说明:数据库准备将各条线路的“线元要素”依次输入各数据库“1”、“2”,注意其中曲线半径右偏为正,直线请输为10^10。
线路起点里程即第一个线元的起点里程,线路终点里程即最后一个线元的终点里程。
如线元起点和上一线元终点半径相同,P=起点里程可简写成P=R,如果线元终点半径和起点半径相同R=终点里程可简写R=P。
如果线元起点半径等于前一线元终点半径,同时本线元是直线或圆,R=P还可省略!!!新增语句解决断链并考虑反算中间结果在断链处时的处理方式。
短链按示例输,长链要把长链后里程前加一位1,转化成短链,如4500.123要输成14500.123。
断链长要按调整后的里程推算,运行时长链后里程要输成类似14500.123。
运行程序:ZFS为主程序运行后首先提示:0 ZS 1 FS?选0正算,选1反算正算计算流程①0 SD?输入线路号,手工输入线元输0,然后依提示输入线元数据;K0?起点里程X?Y?A?起点坐标、方位角LS?线元长R0?RN?起终点半径(右转为正)②K?输入K中桩里程;里程在断链显示"DL"到②③L?输入相对上点偏距;按EXE输入0则输出中桩坐标到②,否则<?输入相对线路前进方向右角,输出坐标;④再次L?输入相对上点偏距;<?输入相对上两点连线前进方向右角,输出坐标到④。
任何时候L?按EXE输入0到②。
反算计算流程①XC?YC?输入测点坐标;0 SD?(同正算);②从起点推算输出里程、外移距;③提示0 NEXT?认为可能还有下个可能选0到④,选其它值到①,除不再提问线路号外其它相同。
④从终点推算输出里程、外移距;⑤提示0 NEXT?认为可能还有下个可能选0到⑥,选其它值到①,除不再提问线路号外其它相同。
⑥K?输入近似里程,输出里程、外移距到⑤;如不输绿色部分代码,执行下列流程①X?Y?输入测点坐标;0 SD?(同正算);②K?输入近似里程,输出里程、外移距到①,除不再提问线路号外其它相同。
在运行过程时,无论正反算,任何时候发生里程超出线路范围都会有警告,偏小会提示“<<!”偏大会提示“>>!”,返回到0SD?重新选择线路、并要求重输里程,此时应该核对数据重算读者可利用上述警告功能在想转换线路时,有意输入线路外里程或坐标。
当然按AC跳出再按光标左、右键重新进入程序也可转换线路,但多了正反算选项。
==================================================== ======================================关于本程序计算坐标的精度为了对坐标计算结果精度心中有数,本人通过数据试算,对本程序的坐标计算精度进行了系统分析,并用回归分析得出了线元长和线元平均半径的关系,得出了一个通用的表达式。
直线精度永远是0不再用公式表示。
只对圆曲线和缓和曲线进行分析。
式中R-平均半径,可用2/|1/RA+1/RB|表示,RA、RB分别是起点、测点半径,LS是起点到测点距离Y-圆曲线标志,圆曲线为1,为0精度要求为恰好1mm时:圆曲线LS=5×R0.9缓和曲线LS=2×R0.85如LS不为上述长度则每延长1.565倍将减少一位精度,反之每缩短1.565倍将增加一位精度。
如计算出某半径精度为1mm时LS=100,若实际长156米则精度为1cm。
实际长为64米则精度为0.1mm。
以下为相关问题的提问与解答WY %外移点计算子程序Lbl 1:J=90:{J}:J=F+J"<":F=J:A=A+Rec(I,J:B=B+J: Prog"ZB":I=0:{I}:I"L"≠0=>Goto 1FS %反算子程序Lbl 1:{KVW}:V"X"W"Y":U=2:Lbl 2:Prog "ZZ":I=V-A:J=W-B:Pol(I,J:J=J-F:I=Rec(I,J:K=K+I:AbsI>1m=>Goto 2△"KJ":K:Pause1:J◢Goto 1以上两个子程序中:Rec与Pol后面的括号怎么只中有半个?另外半个在哪里呢?请楼主给予明示.谢谢.另外,该程序可计算不等缓曲(LS1不等于LS2)曲线中边桩坐标吗?线路起点坐标有什么规定,是否一定得是(ZH点或ZY点)?如是前后两曲线相切只有一个公切点(GQ点),而无(ZH或ZY点时),此种不等缓曲曲线起点坐标怎么确定?起点切线方位角怎么确定?这种情况的曲线中边桩坐标如何用您的程序运行?谢谢指导!!本程序是以线元为单位计算的,无所谓等长和不等长,只要把各线路线元数据依次输入1 2...N等数据子程序就行。