时间:2022-10-08 10:07:40
摘要:利用CAD的二次开发语言LISP,编程实现缓和曲线精确计算和绘制,为道桥设计施工提供方便。
关键词:缓和曲线;计算通式;LISP CAGD
Abstract : Using LISP programming realization of easement curve calculation and drawing.
Key words : Easement curve ;Calculate general formula;LISP CAGD
中图分类号:TP313文献标识码:A文章编号:2095-2104(2013)
1 引言
缓和曲线是道路路线的重要组成部分,它的精确计算和绘制一直是道桥设计者及施工人员探讨的主题问题之一。我们的日常设计绘图通常采用AutoCAD,而在AutoCAD的二次开发语言中LISP最为简单易用,利用LISP语言开发辅助设计及施工工具能为设计者和施工人员的工作带来方便,所以本文着力于利用LISP编程实现缓和曲线精确计算和绘制。
2 缓和曲线计算公式
缓和曲线最主要的计算公式是下式:
公式中A是缓和曲线参数,R是终点曲率半径,L为曲线长度。
经过推导可以得出以下公式:
在教科书和一些文献中通常取以上公式的前2项到3项进行计算,但这种计算只适合小回转角的情况,所以在文献【1】中整理出如下的计算通式
其中:n、k、j、i为正整数,L为曲线长度,(A是缓和曲线参数,R是终点曲率半径)。
用以上回旋线坐标计算公式进行回旋线计算可以保证不产生大数溢出,以余项来控制精度,可以保证所得坐标值满足精度要求[1]。
3 程序实现
3.1 公式拆分
为使程序结构简单清晰,我们可以将通式拆分成几个小的公式,用LISP编程实现通用子函数程序。将这些通用子函数程序放入主程序内部,同时在内部变量中写入这些子程序名,可使这些子程序只在主程序内使用,从而节约内存空间和避免程序引用上的重复。
3.1.1
(defun fxa-1 (k )
(expt -1 (+ k 1))
);;defun
3.1.2
(defun fxa-2x (k )
(/ la (- (* 4.0 k) 3.0))
);;defun
3.1.3
(defun fxa-2y (k )
(/ la (- (* 4.0 k) 1.0))
);;defun
3.1.4
(defun fxa-3 ( )
(/ (* la la) (* 2.0 ls r))
);;defun
3.1.5
(defun fxa-4x (k / n j aa)
(setq n (- (* 2.0 k) 2.0))
(setq j 1 aa 1.0)
(if (/= n 0)
(progn
(repeat n
(setq aa (* aa (/ (fxa-3) j)))
(setq j (+ j 1))
);;repeat
);;progn
);;if
aa
);;defun
3.1.6
(defun fxa-4y (k / n j aa)
(setq n (- (* 2.0 k) 1.0))
(setq j 1 aa 1.0)
(if (/= n 0)
(progn
(repeat n
(setq aa (* aa (/ (fxa-3) j)))
(setq j (+ j 1))
);;repeat
);;progn
);;if
aa
);;defun
3.1.7
(defun fxa-x (nb / i aa a1 a2 a3)
(setq i 1 aa 0.0)
(repeat nb
(setq a1 (fxa-1 i) a2 (fxa-2x i) a3 (fxa-4x i))
(setq aa (+ aa (* a1 a2 a3)))
(setq i (+ i 1))
);;repeat
aa
);;defun
3.1.8
(defun fxa-y (nb / i aa a1 a2 a3)
(setq i 1 aa 0.0)
(repeat nb
(setq a1 (fxa-1 i) a2 (fxa-2y i) a3 (fxa-4y i))
(setq aa (+ aa (* a1 a2 a3)))
(setq i (+ i 1))
);;repeat
aa
);;defun
3.1.9
(defun fxa-xr (nb / aa a1 a2 a3)
(setq a1 (fxa-1 (+ nb 1)) a2 (fxa-2x nb) a3 (fxa-4x nb))
(setq aa (* a1 a2 a3))
aa
);;defun
3.1.10
(defun fxa-yr (nb / aa a1 a2 a3)
(setq a1 (fxa-1 (+ nb 1)) a2 (fxa-2y nb) a3 (fxa-4y nb))
(setq aa (* a1 a2 a3))
aa
);;defun
3.1.11主程序
(defun fx2 (ls r na nb / dl ii dlp x y hhcs na la fxa-yr fxa-xr fxa-1 fxa-2x fxa-2y fxa-3 fxa-4x fxa-4y fxa-x fxa-y )
;;-----------------------------------------------------------------------
(setq hhcs (sqrt (* ls r)));;hhcs为缓和曲线参数
(setq dsa (/ ls nb));;缓和曲线分段长度
(setq ii 1 dlp '() la 0.0)
;;将前面的子程序放在此处
(while (< la ls)
(setq x (+ (fxa-x na) (fxa-xr na)) y (+ (fxa-y na) (fxa-yr na)));;坐标计算
(setq dlp (append (list (list x y)) dlp) ii (+ ii 1))
(setq la (+ la dsa))
);;while
(setq la ls)
(setq x (+ (fxa-x 10) (fxa-xr 10)) y (+ (fxa-y 10) (fxa-yr 10)));;坐标计算
(setq dlp (append (list (list x y)) dlp))
(drawLWpline dlp);;绘制缓和曲线
);;defun&fqxjs2
主程序的调用方式为:(fx2 ls r na nb),这里ls是设计缓和曲线长度,r是终点曲率半径,nb是分段数(即将ls分成多少段计算),na是在精确计算通式中的指数项数k和n(即计算精度的控制,na值越大,计算越精确,同时也越耗时,在文献【1】中提出取8足够在满足精度要求的同时计算速度快。现在计算机的速度已远不是文献【1】出版时的计算机可比,笔者试着将na和nb值同时提高,一般na取10、nb取200对计算时间的延长不明显)。需要注意的是ls、r以及nb的值在输入时最好采用实数的形式输入,如nb取200分段,则输入200.0,这是因为,有时凑巧ls是整数,而在LISP中整数与整数计算的结果也是整数,这样可能引起误差。
3.1.12 绘制缓和曲线(多段线)子程序:drawLWpline
(defun drawLWpline (dlpt / n i dl1 pb)
(setq n (length dlpt) i 1 pb '())
(setq col 7 clo 0));;颜色为白色
(setq linet "continuous"))
(setq lay (getvar "clayer"));;图层为当前层
(foreach x dlpt
(progn
(setq pb (append pb (list (cons 10 x)(cons 40 0)(cons 41 0)(cons 42 0))))
);;progn
);;foreach
(setq dl1 (append (list (cons 0 "LWPOLYLINE")
(cons 100 "AcDbEntity")
(cons 8 lay)
(cons 62 col)
(cons 6 linet)
(cons 100 "AcDbPolyline")
(cons 90 n)
(cons 70 clo)
);;list
pb
);append
);;setq
(entmake dl1)
(princ)
)
本程序中绘制缓和曲线采用的是多段线(LWPOLYLINE)的形式,绘制精度基本能满足误差要求,也可以采用样条曲线(SPLINE)的形式绘制,则精度更高。
下图参照文献【1】中的算例,运用本程序绘制的缓和曲线图示(A=100,ls=286,r=35),该图对na即通式的计算指数项数的取值进行了对比,可以看出na取到8以上能满足计算精度的要求。
4 总结
本文运用LISP编程语言实现了在CAD中精确计算和绘制缓和曲线,这里的CAD可以是AUTODESK公司出品的AutoCAD,也可以是广州中望龙腾软件股份有限公司出品的ZWCAD,因为ZWCAD也支持LISP语言进行二次开发的。当需要坐标系转换的时候可以用LISP函数TRANS,直接进行坐标转换,这比用一大堆的公式进行转换要来得简单快捷,这也是CAGD[4]方法的运用。主程序稍作修改就可以改成坐标计算查询程序。
na和nb的取值也可以参考文献【2】和文献【3】的讨论,对不同大小的回转角,和不同长度的缓和曲线长度,采取不同的取值,使程序的运行更加快捷和精准。
程序编制中还需要注意的是:输入参数的选择问题,本程序在编制时采用的是缓和曲线长ls值和曲率半径r值,如果ls值是用缓和参数A值和r值计算出来的,就需要考虑ls的小数位数问题,所以还可以编制一个输入参数为A值和r值的程序,以适应不同的需求。
参考文献
【1】朱照宏,符锌砂,李方,方守恩,《道路勘测设计软件开发与应用指南》2003年9月
【2】张华安,丁正林,陈中治,缓和曲线动态间隔取拟合点及若干计算理论问题探讨,《交通科技》2010年7月
【3】张鹏飞,公路缓和曲线的计算公式与精度分析,《中国信息科技》2010年第3期
【4】陈伯雄,冯伟,《Visual LISP程序设计-技巧与范例》2002年8月