线元法线路坐标正反算程序
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
经苦心钻研,奋战多日,终于编写出了代码短,速度快,精度高,功能全的线路坐标正反算程序,欢迎试用并提出宝贵意见。
功能简介及特点:
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 1
ZS %正算子程序
{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=1
ZZ %高斯法中桩子程序(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+BsinH
WY %外移点计算子程序
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 1
WZ %位置显示子程序
"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=1
DL %断链处理子程序
"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 1
0 %手工输入子程序
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 E
2 %线路二数据库子程序
输入要求和线路一相同。
数据输入要求:
①是线路总体资料格式
②⑤是标准线元资料格式,按里程顺序依次排
④断链资料格式
⑦最后一个线元资料格式
注: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 1
FS %反算子程序
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等数据子程序就行。
计算器说明书规定了可省略表达式右端的括号及其它一些可省略的符号,本贴的使用说明也有提到。
各主点坐标推算可试试本人的另一个贴子,可以递推主点坐标。
请1楼抽空看看计算器的说明书并通读本贴的说明部分!!!!
又有修改,解决了手动输线元不能计算同一线元第二个点问题。
调整了变量、重写了高斯4节点坐标计算内核。
楼主,调试了,不行啊.运行时一直提示L
你再试试,我的4800计算器没空间了,没有详细测试,也可能上传时录入有问题,刚修改了一下,如还不行请和QQ:448375501
调试成功了,很好用,谢谢楼主的无私奉献.我还有一个问题想请教一下李老师,遇到线路断链应该怎么处理程序?
短链部分在数据子程序里写成
L=L+Q:Q=短链长:K≤L+Q=>"DL":Goto EΔ
就行了
长链要重新整理里程,把长链后部的里程加一个1000米或10000米(就是原来的里程前面加个1)转换成短链
李老师我有个问题,缓和曲线的半径是不是圆半径R+P呀,就是缓和曲线的半径了
你说的缓和曲线是含缓和曲线的整个交点(含两个以上线元),本程序的缓和曲线只是其中的缓和曲线段。
你说的缓和曲线半径是等效半径,是针对整个曲线的,本程序里的半径是指一个线元(曲线段)的两端半径。
L=线路起点里程:M=线路终点里程:Prog"YC":Z=1=>Goto EΔ
Q=线元长:K≤L+Q=>X=起点X坐标:Y=起点Y坐标:A=起点方位角:P=起点半径:R=终点半径:Goto EΔ
L=L+Q:Q=123:K≤L+Q=>X=123:Y=123:A=123:P=123:R=123:Goto EΔ一条线路怎么添加更多线元? 缓和曲线圆曲线段起点半径和终点半径如何输入呀?我试着输入了一个缓和曲线的线元但是计算出来的结果不对呀我不知道是不是我输错了
请看程序里的说明
李老师,你说的断链处理我弄了一天,没弄明白,麻烦你再说详细点好吗?拜托,谢谢!
你可以把断链当成一个线元,但必须断链后里程大于断链前里程(短链),线元长是两里程差,但并无线元资料。
如果是长链,就把断链后的所有里程前加1,如有一个长链,断链前里程4510.123=断链后里程4500.123,断链后里程小于断链前里程要,断链后里程4500.123要当成14500.123,断链长为9990.
运行时,输长链前里程时不变,长链后里程前加1
程序里红色代码为和断链相关的代码。
本程序运行时,输入里程为断链范围任一里程时,输出坐标都是断链
点坐标。
正常线元坐标显示格式
XY
#########.###
#########.###
断链处坐标显示格式为
DL
XY
#########.###
#########.###
各位这个程序我始终没有搞懂我现在在干一条缓和曲线高架桥ZH 100410.137方位角174-07-22.5
ZHx2460751.0862 ZHy501630.5236 缓曲长80 左转角39-54-29.7 HZ 100803.576 麻烦大家谁能帮我把他输进这个程序我反复输了好多遍检查程序也没有输入错误但是得出的结果和设计值相差很多那位哥们这个程序运行成功了的指教小弟一下 qq 283070278
注意:
1、本程序是以线元为单位计算,每个线元需要都线元长、起始坐标、方位角、起、终点半径。
2、数据子程序里的线路起点里程是第一个线元的起点里程,线路终点里程是最后一个线元的终点里程。
线路起终点里程差和所有的线元长的和相等。
3、第二个及以后的线元起点里程其实在数据子程序里用L=L+Q 算出来了。
4、角度单位错、或不注意半径正负,或程序里的标点符号没输全等都是以前网友出过的错。
李老师,不好意思,我还有一个问题想问,就是短链部分线元元素要不要输,还有短链所在的那个线元元素Q输什么长度?谢谢!
看说明呀。
断链处实际长度为0,故不用线元要素,但里程又有差值,Q要输,Q输断链前后里程差
DL %断链处理子程序
"DL":K=L:I>0=>K=L+Q
④Q=短链长:K≤L+Q=>Prog "DL":Goto EΔL=L+Q:
短链按示例输,长链要把长链后里程前加一位1,转化成短链,如4500.123要输成14500.123。
断链长要按调整后的里程推算,运行时长链后里程要输成类似14500.123。
以上是贴里的原文。
谢谢李老师,终于可以了,但是反算时,在短链后输入任何坐标都显示
DL,这是为什么呀?
是我考虑不周,经过仔细分析,程序改了一下。
数据库子程序第一行前加了Lbl B:
第四行断链所在行对应改成Goto B,另外K≤L+Q也改成K< L+Q
请再测试一下
近日在改写以前发布过的一个交点法程序,功能与此程序接近,带中桩高程计算,即将发布。
原版为数据全部保存在扩充,现改写成用子程序保存。
故先将本贴改名注明(线元法)。
老师,还有一个问题,反算里程是对了,但在显示里程前还会显示DL 我指的是断链后面的里程还会显示DL
那是我特意设计的,好让用户知道里程在断链附近,而且,如果我没说错的话,应该是坐标在距断链小于断链长才会出现你说的情况,远了就不会显示,反算出来的里程应该是正确的。
你试试,正算时输个断链间的任意里程,显示坐标时也会先显示一个DL再显示断链点坐标
正算时输个断链间的任意里程,是会先显示一个DL
反算出来的里程也是完全正确的,但是我这里有一个长链20多米,把它转化成短链后就是短链9800米,那反算是岂不是9800米范围内的里程都显示DL
祝贺你测试成功!
是的,显示一个DL也不多余呀,很有趣的。
这是程序设计结构牢固的要求,我是比较在意这些的,结果正确,提示得当。
如果你不输绿色代码,如果知道坐标在断链后,反算时你输一个断链后的假定里程,一般就不会出现DL提示了。
如果保留绿色代码,在高速公路主线或转折较小的山区公路,点在长链后时,输入坐标,输出第一次会提示DL,KJ里程、位置。
然后提示0NEXT?,你按EXE,就会再输出一个KJ里程、位置,两次的里程、位置一般是一样的,但第二次就不提示DL,那是因为第二次是从后往前试探的。
李老师你的程序我运行了,还有一个问题请指教:
正算时,我算出中桩的点后算边桩点后算结构物所有角点坐标。
我发现只有在算正交的边桩点后算垂直于法线的点,并且在右侧算出的角点坐标才正确。
如果算某一里程的斜交边桩后不管是左右往下算都不正确,是否是本人浅薄,没有理解角度的输入,请不吝赐教。
能不能说说你的反算是怎么弄的?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
根据测点坐标和假定里程坐标差用Pol()求出的两点斜距I及方位角J 和假定里程切线F的夹角J-F,再用Rec()求出垂距J和垂足到假定点距离I,I为正说明假定里程偏小,为负说明假定里程偏大。
假定里程改正后重算,直到误差小1mm.输出结果。
程序里I=Rec(I,J:K=K+I可以简写成K=K+Rec(I,J。
这样又省了4个字节(程序已按此更新了)。
这是因为Rec()函数的输出结果自动存到I=里程误差,J=测点到中线距离(右正左负)。
本程序有意用I、J 做中间变量的用意也就是方便省略步数,
我估计你是在提示<?90时没有输任何数按EXE跳过了!程序里面算边桩<?90是默认相对上两点前进方向右转角,如果不是90要手工输入。
如果是默认值90,可以按EXE跳过。
程序里所有?下显示数据和准备输入数据一样时才可按EXE跳过!!!
原来我也搞了一个跟你类似的程序,用的也是您这种方法,我先是10CM步进,然后5,然后1,最后1MM,支距太远的话运算要30秒以上。
没有数据库,直接把线元编进去,字节数非常庞大,而且只适合我那一个隧道。
看了您的,才知道什么就老师!
李老师,不好意思,还有一个问题请你核一下,就是反算时,在直线上能自动算出里程和边距,但是在缓和曲线及圆曲线上时第一第二次反算里程和边距都差很多,直到第三次输入近似里程时才反算正确.这是为什么呀?
那一定是碰到了类似回头曲线的情况了。
你一定是是在计算一个匝道或山区公路,而且存在累计转角超过90度的几个连续曲线,如果凑巧,点就是在直线也可能得出两个不同的结果,但错误的结果偏距一定很大。
只要测点可以向远处的中线某点做垂线就会得出不同的反算结
果,你画个图就明白了。
公路主线上不会出现你说的情况的,这些我在贴上的前言上说过了,你可以再试试基本直伸的公路主线。
程序里的不用输近似里程只适合基本直伸的公路上(任意取N个交点转角和不大于90度)。
我这个曲线半径500多米,转角83度多,会不会出现这种情况啊? 刚我说了是几个交点的累计转角大于90度才容易算出两个以上结果,你再看相邻的曲线转向是不是相同。
你画个草图试试呀,看能在图上做几个垂足。
再说明白点,如果你检查一个圆心坐标,圆弧上任一点都是正确结果,如果过圆弧上任一点和圆心连线,延长后会和远处线路相交或接近平行,这条线附近上的有些点明明在远处线路附近,却会得出是刚那个圆上的里程,但偏距很远的点。
这就是为什么我强调是某N个交点的累计转角大于90度,而不是说一个曲线。
快画个图试试吧。
这时用近似里程引导一下程序就会直接得出正确结果。
刚讲的有点错,应该是角度加、减180度和距离反号是一样的。
5米,30度和-5米,210度是同一个点。
210度又可以写成-150度
和两点连线方向一样距离为正。
李老师我试了一下,还是不太对呀,谢谢,就是在线路前进方向的左侧边桩点后往下算不行,主要是第一个点不行,第二个点及往后算的点都行
还有斜交左右侧边桩点后往下算坐标角度都不好掌握
你不要管什么左右,就看新点和上点连线方向与上两点方向右角是多少就行,就象导线侧量一样,导线长就是距离,右角就是转角。
距离永远输正的,角度看右角是多少就输多少,角度输-30度和330度是一样的。
距离的正负表示线的方向,角度的正负表示偏向的左右。
这是极坐标的一般规定呀。
再说说把我自己都搞晕了。
请问楼主,该程序是否能用于整条线路(交点大于60个),数据库如何处理?盼指点一下,万分感谢!。