[基于LISP编程实现缓和曲线精确计算和绘制]cass绘制缓和曲线

  摘要:利用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 (