找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1107|回复: 6

[LISP函数]:缓和曲线等曲线线元绘制(LISP)函数

[复制链接]

已领礼包: 111个

财富等级: 日进斗金

发表于 2005-6-24 21:58:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
曲线线元绘制(LISP)函数
[php]
;一、约定
       ; (1) 以道路中线的前进方向(即里程增大的方向)区分左右;当线元往左偏时,
;线元偏向标志=-1;当线元往右偏时,线元偏向标志=1;当线元为直线时,线元偏向标志=0。
        ;(2) 当所求点位于中线时,边距=0;当位于中线左铡时,边距取负值;当位于中线中线右
;侧时,边距取正值。
       ; (3) 当线元为直线时,其起点、止点的曲率半径为无穷大,以10的45次代替。
        ;(4) 当线元为圆曲线时,无论其起点、止点与什么线元相接,其曲率半径均等于圆
;弧的半径。
         ;(5) 当线元为完整缓和曲线时,起点与直线相接时,曲率半径为无穷大,以10的45
;次代替;与圆曲线相接时,曲率半径等于圆曲线的半径。止点与直线相接时,曲率半
;径为无穷大,以10的45次代替;与圆曲线相接时,曲率半径等于圆曲线的半径。
         ;(6) 当线元为非完整缓和曲线时,起点与直线相接时,曲率半径等于设计规定的
;值;与圆曲线相接时,曲率半径等于圆曲线的半径。止点与直线相接时,曲率半径等
;于设计规定的值;与圆曲线相接时,曲率半径等于圆曲线的半径。
;二、功能
;在Auto CAD中按1:1000比例绘制曲线线元(直线、圆曲线、完整缓和曲线、非完整型缓和曲线)。
;三、源程序
;==================  test  ========================================================
;测试函数
(defun c:test()
  (setq xyys (list
        (list 500.000 19942.837 28343.561 2.186466069 269.256 1E45   1E45     0)
               (list 769.256 19787.340 28563.378 2.186466069  37.492 1E45   221.75   -1)
        (list 806.748 19766.566 28594.574 2.101929446 112.779 221.75 221.75   -1)
        (list 919.527 19736.072 28701.893 1.593343217  80.285 221.75 9579.228 -1)
        (list 999.812 19744.038 28781.659 1.408141337 100.000 1E45   1E45      0)
      )
n    (length xyys)  i 0
  )
  (repeat n
     (hqxxy (nth i xyys))
     (setq i (1+ i))
  )
)
;================   hqxxy ========================================================
;给制曲线线元函数
;入口参数线元要素xyb为:
;xyb=(线元起点里程  线元起点X坐标  线元起点Y坐标  线元起点切线方位角(以弧度为单位)
; 线元长度    线元起点曲率半径  线元止点曲率半径   线元偏向标志)
(defun hqxxy(xyb / s0 x0 y0 f0 ls r0 rn q pt0  ptn sn xyn x1 x2 y1 y2 mj ptt pp s i n)
  (setq cm (getvar "cmdecho") os (getvar "osmode"))
  (setvar "cmdecho" 0)(setvar "osmode" 0)
  (setq s0 (nth 0 xyb)  x0 (nth 1 xyb)  y0 (nth 2 xyb)  f0 (nth 3 xyb)
ls (nth 4 xyb)  r0 (nth 5 xyb)  rn (nth 6 xyb)  q  (nth 7 xyb)
pt0 (list y0 x0)
sn (+ s0 ls)
xyn (qxzs xyb (list sn 0))
ptn (list (cadr xyn) (car xyn))
x1 x0  y1 y0
x2  (car xyn) y2 (cadr xyn)

  )
  (if (< x2 x1) (setq x1 x2 x2 x0))
  (if (< y2 y1) (setq y1 y2 y2 y0))
  (command "undo" "be")
  (command "zoom" "w" (list (- y1 200) (- x1 200) 0) (list (+ y2 200) (+ x2 200) 0))
  (cond ((and (= r0 rn) (= r0 1e45)) (command "line" pt0 ptn ""))
((and (= r0 rn) (< r0 1e45))
     (setq ptt (polar pt0 (+ f0 (* q 0.5 pi)) r0)
    mj  (sjxmj pt0 ptn ptt)
     )
     (if (and (> q 0) (< mj 0)) (setq pp pt0 pt0 ptn ptn pp))
     (if (and (< q 0) (< mj 0)) (setq pp pt0 pt0 ptn ptn pp))
     (command "_arc"  pt0 "e" ptn  "r" r0)
)
(t  (command "pline")
     (setq n  (+ 2 (fix (/ ls 0.5))) i 0)
            (repeat n
               (setq s (+ s0 (* i 0.5)))
               (if (> s sn) (setq s sn))
               (setq xyn (qxzs xyb (list s 0)))
               (command (list (cadr xyn) (car xyn)))
               (setq i (1+ i))
     )
     (command "")
)
  )
  (command "undo" "e")
  (setvar "cmdecho" cm)(setvar "osmode" os)(princ)
     
)
;=======================      qxzs      ==============================================
;正算函数(由里程和边距计算坐标)
;入口参数线元要素xyb及sz为:
;xyb=(线元起点里程  线元起点X坐标  线元起点Y坐标  线元起点切线方位角(以弧度为单位)
; 线元长度    线元起点曲率半径  线元止点曲率半径   线元偏向标志)
;sz=(要计算点的中线里程   要计算点距中线的边距)
;返回值=(所求点的X坐标   所求点的Y坐标   所求点的法线方位角)
(defun qxzs(xyb sz / f0 q c d rr vv i xs ys w ri vl ff f)
    (setq f0 (nth 3 xyb)  q  (nth 7 xyb)
   c  (/ 1.0 (nth 5 xyb))
   d  (/ (- (nth 5 xyb) (nth 6 xyb)) 2.0 (nth 4 xyb) (nth 5 xyb) (nth 6 xyb))
          rr '(0.1739274226 0.3260725774 0.3260725774 0.1739274226)
   vv '(0.0694318442 0.3300094782 0.6699905218 0.9305681558)
   i   0  xs  0   ys 0
   w   (abs (- (car sz) (nth 0 xyb)))
    )
    (repeat 4
        (setq  ri (nth i rr) vl (* (nth i vv) w)
        ff (+ f0 (* q vl (+ c (* vl d))))
        xs (+ xs (* ri (cos ff)))
        ys (+ ys (* ri (sin ff)))
        i  (1+ i)
)
    )
    (setq f  (+ f0 (* q w (+ c (* w d))) (* 0.5 pi))
   xs (+ (nth 1 xyb) (* w xs) (* (last sz) (cos f)))
   ys (+ (nth 2 xyb) (* w ys) (* (last sz) (sin f)))
    )
    (list xs ys f)
)
;========================  sjxmj  =================================================
(defun sjxmj(pt1 pt2 pt3 / x1 y1 x2 y3 x3 y3 mj)
   (setq x1 (car pt1) y1 (cadr pt1)
  x2 (car pt2) y2 (cadr pt2)
  x3 (car pt3) y3 (cadr pt3)
         mj (* 0.5 (+ (* x1 y2) (* x2 y3) (* x3 y1)
        (* -1.0 x1 y3) (* -1.0 x2 y1) (* -1.0 x3 y2)))
   )
   
)
[/php]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-6-24 22:36:52 | 显示全部楼层
请楼主说明一下怎样使用?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 111个

财富等级: 日进斗金

 楼主| 发表于 2005-6-24 23:35:38 | 显示全部楼层
程序加载后,在命令行中键入“test”即可绘程序中所给的五个线元(直线+完整缓和曲线+圆曲线+非完整缓和曲线+直线)。每个线元的数据用“list”组表,格式如下:
(list 线元起点里程  线元起点X坐标  线元起点Y坐标  以弧度为单位的线元起点切线方位角  线元长度  线元起点曲率半径  线元止点曲率半径  线元偏向标志)。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-6-25 12:40:35 | 显示全部楼层
有点麻烦.还不如用专业的布线程序.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-8-6 20:47:41 | 显示全部楼层
能作个演示帖子发上来好吗?
   热切期盼!!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-3-18 03:50:21 | 显示全部楼层
我太菜了  有点难啊
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2006-3-19 19:50:06 | 显示全部楼层
看不懂,不过支持一下!!!!呵呵
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-29 04:17 , Processed in 0.292943 second(s), 44 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表