明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 2658|回复: 3

不确定拟合点数的样条曲线的绘制

[复制链接]
发表于 2003-12-3 18:17:00 | 显示全部楼层 |阅读模式
本人在解决不确定拟合点数的样条曲线的绘制时,用了一个土办法。具体是,先根据终点和起点画样条曲线。然后将样条曲线的序列数据a1取出,加入剩下不确定数量的点列。当然点列应该是(11 .. .. ..)的样式。然后(entmod a1)。这样就能画了。但是,当我移动坐标系后,出现了问题。请高手们帮我看看:(程序有点乱,请多包涵)
  1. ;;;;;;;;;;;;;;;;;;;;;;;;
  2. ;;;     角度转换        
  3. ;;;;;;;;;;;;;;;;;;;;;;;;
  4. ;;;参数说明:
  5. (defun Degrees->Radians(numberOfDegrees)
  6.     (* pi (/ numberOfDegrees 180.0))
  7. )
  8. ;;;;;;;;;;;;;;;;;;;;;;;;
  9. ;;;二维点转换为三维点   
  10. ;;;;;;;;;;;;;;;;;;;;;;;;
  11. ;;;参数说明:
  12. (defun VD:2dPoint->3dPoint(2dPt)
  13.     (list (float (car 2dPt)) (float (cdr 2dPt)) 0.0)
  14. )
  15. ;;;;;;;;;;;;;;;;;;;;;;;;
  16. ;;;  三维点转换为二维点
  17. ;;;;;;;;;;;;;;;;;;;;;;;;
  18. ;;;参数说明:
  19. (defun VD:3dPoint->2dPoint(3dPt)
  20.     (list (float (car 3dPt))(float (cadr 3dPt)))
  21. )
  22. ;;;;;;;;;;;;;;;;;;;;;;;;
  23. ;;;      绘制箭头      
  24. ;;;;;;;;;;;;;;;;;;;;;;;;
  25. ;;;参数说明:
  26. (defun vd:arrow
  27.                (pt ang               ratio           /               ang1
  28.                    angleBackward           angleUpward angleDownward
  29.                    arrowLength arrowWidth  halfWidth   pt1
  30.                    p1               p2           s1
  31.                   )
  32.   (setq        ang1              (Degrees->Radians ang)
  33.         angleBackward (+ ang1 pi)
  34.         angleUpward   (+ ang1 (/ pi 2.0))
  35.         angleDownward (+ angleUpward pi)
  36.         arrowLength   (* 2.5 ratio)
  37.         arrowWidth    (* 0.83 ratio)
  38.         halfWidth     (/ arrowWidth 2.0)
  39.         pt1              (polar pt angleBackward arrowLength)
  40.         p1              (polar pt1 angleUpward halfWidth)
  41.         p2              (polar pt1 angleDownward halfWidth)
  42.   )
  43.   (command ".line" pt p1 p2 "c" "")
  44.   (setq s1 (ssget "C" pt p1))
  45.   (command ".hatch" "solid" s1 "")
  46.   (princ)
  47. )
  48. ;;;;;;;;;;;;;;;;;;;;;;;;
  49. ;;;绘制坐轴及横向分格线
  50. ;;;;;;;;;;;;;;;;;;;;;;;;
  51. ;;;参数说明:
  52. (defun vd:coordinate_drawing (p1 p2         space         ratio         /
  53.                                  nStart         i         nTotal         a
  54.                                  xEnd         yEnd         original
  55.                                  tp         tp1         textHeight
  56.                                  s1
  57.                                 )
  58.   (setq
  59.     nStart     (fix (/ (cadr p1) space))
  60.     i               nStart
  61.     nTotal     (- (fix (/ (cadr p2) space)) nStart)
  62.     a               (* ratio 20)
  63.     Xend       (list (+ (car p1) a) (* nStart space) 0.0)
  64.     yend       (list 0.0 (+ (* a 0.5) (cadr p2)) 0.0)
  65.     original   (list 0.0 (cadr xend) 0.0)
  66.     a               (* ratio 3.0)
  67.     tp               (polar xend (* pi 1.3) (* 1.5 a))
  68.     textHeight (* ratio 3.0)
  69.   )
  70.   (vd:arrow xend 0 ratio)
  71.   (vd:arrow yend 90 ratio)
  72.   (command "line" original yend "")
  73.   (command "line" original xend "")
  74.   (setq s1 (ssget "L"))
  75.   (command "text" tp textHeight 0.0 "X" "")
  76.   (setq tp (polar yend (* pi 1.25) (* 1.414 a)))
  77.   (command "text" tp textHeight 0.0 "Y" "")
  78.   (setq tp (polar original pi a))
  79.   (if (= i 0)
  80.    (progn
  81.      (command "text" tp textHeight 0.0 "A" "")
  82.      (setq tp1
  83.             (polar
  84.               original
  85.               0.0
  86.               (+ (distance Xend original) a)
  87.             )
  88.      )
  89.      (command "text" tp1 textHeight 0.0 "A" "")
  90.    )
  91. )
  92.   (repeat nTotal
  93.     (setq i (1+ i))
  94.     (command "offset" space s1 yend "")
  95.     (setq s1 (ssget "L"))
  96.     (cond
  97.       ((= i 1) (setq str "B"))
  98.       ((= i 2) (setq str "C"))
  99.       ((= i 3) (setq str "D"))
  100.       ((= i 4) (setq str "E"))
  101.       ((= i 5) (setq str "F"))
  102.       ((= i 6) (setq str "G"))
  103.       ((= i 7) (setq str "H"))
  104.       ((= i 8) (setq str "I"))
  105.       ((= i 9) (setq str "J"))
  106.       ((= i 10) (setq str "K"))
  107.       ((= i 11) (setq str "L"))
  108.       ((= i 12) (setq str "M"))
  109.       ((= i 13) (setq str "N"))
  110.       ((= i 14) (setq str "O"))
  111.       ((= i 15) (setq str "P"))
  112.       ((= i 16) (setq str "Q"))
  113.       ((= i 17) (setq str "R"))
  114.       ((= i 18) (setq str "S"))
  115.       ((= i 19) (setq str "T"))
  116.       ((= i 20) (setq str "U"))
  117.       ((= i 21) (setq str "V"))
  118.       ((= i 22) (setq str "W"))
  119.     )
  120.     (setq tp (polar tp (/ pi 2.0) space)
  121.           tp1 (polar tp1 (/ pi 2.0) space))
  122.     (command "text" tp textHeight 0.0 str "")
  123.     (command "text" tp1 textHeight 0.0 str "")

  124.   )
  125.   (princ)
  126. )
  127. ;;;;;;;;;;;;;;;;;;;;;;;;
  128. ;;;    断面数据输入     
  129. ;;;;;;;;;;;;;;;;;;;;;;;;
  130. (defun vd:dataInput(/ fname f i blst a lst n str)
  131.   (setq        fname (getfiled "Select a data file" "" "txt" 8)
  132.         f     (open fname "r")
  133.         i     0
  134.         Blst  nil
  135.         a     0.0
  136.   )
  137.   (while (setq str (read-line f))
  138.    (setq lst nil
  139.          n   (read str)
  140.    )
  141.    (if (< n 10)
  142.      (setq str (substr str 3))
  143.      (setq str (substr str 4))
  144.    )
  145.     (setq flag (read str)
  146.           str  (substr str 3)
  147.     )
  148.     (while (read str)
  149.       (setq a        (read str)
  150.             i        (+ 2 (strlen (rtos a 2)))
  151.             str        (substr str i)
  152.             lst        (cons a lst)
  153.       )
  154.     )
  155.     (setq lst  (reverse lst)
  156.           lst  (cons n (cons flag lst))
  157.           Blst (append Blst (list lst))
  158.           n    (1+ n)
  159.     )
  160.   )
  161.   (close f)
  162.   Blst
  163. )
  164. ;;;;;;;;;;;;;;;;;;;;;;;;
  165. ;;;    断面数据处理     
  166. ;;;;;;;;;;;;;;;;;;;;;;;;
  167. (defun VD:dataProcessing(lst space / n i a b c d l1 l2 templist)
  168.   (setq        n (length lst)
  169.         i (/ n 2)
  170.   )
  171. (repeat        i
  172.   (setq        a         (car lst)
  173.         b         (cadr lst)
  174.         l1         (cdr a)
  175.         l2         (cdr b)
  176.         c         (VD:dp1 l1 space)
  177.         d         (VD:dp1 l2 space)
  178.         templist (cons (car a)
  179.                        (list
  180.                          c
  181.                          d
  182.                        )
  183.                  )
  184.   )
  185.   (setq        lst (append (cddr lst) (list templist))
  186.   )
  187. )
  188.   lst
  189. )
  190. (defun VD:dp1 (lst space / n j flag startPt endPt y temp)
  191.   (setq        n        (length lst)
  192.         flag        (car lst)
  193.         startPt        (cons (nth 2 lst) (cadr lst))
  194.         endPt        (cons (cadr (reverse lst))
  195.                       (last lst)                     
  196.                 )
  197.         lst        (reverse (cddr (reverse (cdddr lst))))
  198.         y        (*
  199.                    (fix (/ (cdr startPt) space))
  200.                    space
  201.                 )
  202.         j        (- n 5)
  203.   )
  204.   (repeat j
  205.     (setq y    (+ y space)
  206.           temp (cons (car lst) y)
  207.           lst  (cdr lst)
  208.           lst  (append lst (list temp))
  209.     )
  210.   )
  211.   (setq        lst   (cons startPt lst)
  212.         lst   (reverse(cons endPt (reverse lst)))
  213.         lst   (cons flag lst)
  214.   )
  215.   lst
  216. )
  217. ;;;;;;;;;;;;;;;;;;;;;;;;
  218. ;;;二维点转换为三维点   
  219. ;;;;;;;;;;;;;;;;;;;;;;;;
  220. ;;;参数说明:
  221. (defun VD:2dPoints->3dPoints (plst / n 2dPt)
  222. (setq n     (length plst))
  223.   (repeat n
  224.     (setq plst (append plst
  225.                        (list (list 11
  226.                                    (float (car (car plst)))
  227.                                    (float (cdr (car plst)))
  228.                                    0.0
  229.                              )
  230.                        )
  231.                )
  232.           plst (cdr plst)
  233.     )
  234.   )
  235.   plst
  236. )
  237. ;;;;;;;;;;;;;;;;;;;;;;;;
  238. ;;;   断面轮廓线绘制   
  239. ;;;;;;;;;;;;;;;;;;;;;;;;
  240. (defun VD:draw (ptLst / dLst p1 p2 a1)
  241.   (setq        dLst nil
  242.         dLst (VD:2dPoints->3dPoints (cdr (cadr ptLst)))
  243.         p1   (cdr (car dLst))
  244.         p2   (cdr (last dLst))
  245.         dLst (cdr (vl-remove (last dLst) dLst))
  246.   )
  247.   (princ (reverse dLst))
  248.   (command ".spline" p2 p1 "" "" "")
  249.   (setq a1 (reverse (entget (ssname (ssget "L") 0))))
  250.   (princ a1)
  251.   (setq a1 (reverse (append (list (car a1))
  252.                             dLst
  253.                             (cdr a1)
  254.                     )
  255.            )
  256.   )
  257.   (setq a1 (entmod a1))
  258.   (princ a1)
  259.   (setq        dLst    (VD:2dPoints->3dPoints (cdr (caddr ptLst)))
  260.         p1        (cdr(car dLst))
  261.         p2        (cdr(last dLst))
  262.         dLst    (cdr (vl-remove (last dLst) dLst))
  263.   )
  264.   (princ (reverse dLst))
  265.   (command ".spline" p2 p1 "" "" "")
  266.   (setq        a1 (reverse (entget (ssname (ssget "L") 0))))
  267.   (princ a1)
  268.   (setq        a1 (reverse (append (list (car a1))
  269.                             dLst
  270.                             (cdr a1)
  271.                     )
  272.            )
  273.   )
  274.   (setq a1 (entmod a1))
  275.   (princ a1)
  276.   (setq        p1 (VD:2dPoint->3dPoint (car(cdr (cadr ptLst))))
  277.         p2 (VD:2dPoint->3dPoint (car(cdr (caddr ptLst))))
  278.   )
  279.   (command ".line" p1 p2 "")
  280.   (setq        p1 (VD:2dPoint->3dPoint (last (cdr(cadr ptLst))))
  281.         p2 (VD:2dPoint->3dPoint (last (cdr(caddr ptLst))))
  282.   )
  283.   (command ".line" p1 p2 "")
  284.   (setq        p1 (VD:2dPoint->3dPoint (car(cdr (cadr ptLst))))
  285.         p2 (VD:2dPoint->3dPoint (last (cdr(caddr ptLst))))
  286.   )

  287.   (VD:coordinate_drawing p1  p2 20.0 2)

  288. )
  289. ;;;;;;;;;;;;;;;;;;;;;;;;
  290. ;;;   断面尺寸标注      
  291. ;;;;;;;;;;;;;;;;;;;;;;;;
  292. (defun VD:ddim (ptLst ratio / pt tp ptlst1 i)
  293.   (setq        ptlst1           (cdr (cadr ptLst))
  294.         i           (length ptlst1)
  295.         textHeight (* ratio 3.0)
  296.   )
  297.   (repeat i
  298.     (setq
  299.       pt     (vd:2dPoint->3dPoint (car ptlst1))
  300.       tp     (polar (list 10.0 (cadr pt) 0.0) (/ pi 2) (* ratio 1.0))
  301.       ptlst1 (cdr ptlst1)
  302.       str    (rtos (car pt) 2)
  303.     )
  304.     (if        (= (rem (cadr pt) 20.0) 0.0)
  305.       (progn
  306.         (command "text" tp textHeight 0.0 str "")
  307.         (vd:arrow pt 0 ratio)
  308.       )
  309.       (progn
  310.         (setq p1 (list 0.0 (cadr pt) 0.0)
  311.               p2 (polar p1 0 (car pt))
  312.         )
  313.         (command "dim1" "Hor" p1 pt p2 "")
  314.         (setq p1 (list (car pt) 0.0 0.0)
  315.               p2 (polar p1 (/ pi 2) (cadr pt))
  316.         )
  317.         (command "dim1" "Ver" p1 pt p2 "")
  318.       )
  319.     )
  320.   )
  321.   (setq        ptlst1 (cdr (caddr ptLst))
  322.         i      (length ptlst1)
  323.   )
  324.   (repeat i
  325.     (setq
  326.       pt     (vd:2dPoint->3dPoint (car ptlst1))
  327.       tp     (polar (list 280 (cadr pt) 0.0) (/ pi 2) (* ratio 1.0))
  328.       ptlst1 (cdr ptlst1)
  329.       str    (rtos (car pt) 2)
  330.     )
  331.     (if        (= (rem (cadr pt) 20.0) 0.0)
  332.       (progn
  333.         (command "text" tp textHeight 0.0 str "")
  334.         (vd:arrow pt 0 ratio)
  335.       )
  336.       (progn
  337.         (setq p1 (list (car pt) 0.0 0.0)
  338.               p2 (polar p2 180 30.0)
  339.         )
  340.         (command "dim1" "Ver" p1 pt p2 "")
  341.         (setq p1 (list 0.0 (cadr pt) 0.0)
  342.               p2 (polar p1 0 (car pt))
  343.         )
  344.         (command "dim1" "Hor" p1 pt p2 "")
  345.       )
  346.     )
  347.   )
  348. )
  349. ;;;;;;;;;;;;;;;;;;;;;;;;
  350. ;;;        主程序      
  351. ;;;;;;;;;;;;;;;;;;;;;;;;
  352. (defun c:VD()
  353.     (setq scmdecho (getvar "cmdecho"))
  354.     (setvar "cmdecho" 0)
  355.     (setq ptLst        nil
  356.           ptLst        (VD:dataInput)
  357.           ptLst        (VD:dataProcessing ptLst 20.0)
  358.           n        (length ptLst)
  359.           i        1
  360.           ratio 2
  361.           a        (* ratio 50.0)

  362.     )
  363.   (repeat n
  364.     (setq pptLst (assoc i ptLst)
  365.           i         (1+ i)
  366.     )
  367. ;;;    确定作图区域(左上角点与右下角点)
  368.     (setq leftTop     (vd:2dPoint->3dPoint (last (caddr pptLst)))
  369.           rightBottom (vd:2dPoint->3dPoint (cadr (caddr pptLst)))
  370.           rightBottom (list (+ (car rightBottom) a) 0.0 0.0)
  371.           leftTop     (list 0.0 (+ (* a 0.5) (cadr leftTop)) 0.0)
  372.           newOriginal (list (car rightBottom) 0.0 0.0)
  373.     )
  374.     (VD:draw pptLst)
  375.     (VD:ddim pptLst 2.0)
  376.     (command "ucs" "m" newOriginal)
  377.   )
  378.   (command "ucs" "")
  379. ;;;    (VD:dataOut )
  380.     (setvar "cmdecho" scmdecho)
  381. )

数据文件如下:

本帖子中包含更多资源

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

x
发表于 2003-12-3 18:36:00 | 显示全部楼层
你的数据是什么格式,,,
看完你的数据处理以后,看那些结果,不知道你到底是要做什么?
能否详细说说你具体是要做什么?
 楼主| 发表于 2003-12-4 10:19:00 | 显示全部楼层
是纯文本格式的,一个断面有两条样条曲线,每行中的数据是一条样条曲线的数据,第一个数据表示第几个断面.第二个数据是样条曲线所在侧的识别号.这里只有正和反两侧.0表示正,1表示反.剩下的全是曲线上的点的数据.这里有个特殊情况,就是中间各个点的y间距是相等的,在程序中用了space变量就是这个间距。比如第一组,起点是(269.51 0.0) 终点是(122.14 251.66),中间的数据全部是各个点的坐标的数据。读入进行数据处理以后得到的数据序列如下

当然,这里我用了3组同样的断面数据,因为这些数据还是我自己整理出来的,总共有20多个,我只是想测试一下,应该完全可以的。
不好意思,太麻烦你了,我先谢谢了!

本帖子中包含更多资源

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

x
发表于 2003-12-4 10:52:00 | 显示全部楼层
还是不明白。。。
你说的断面是什么的断面?
为什么起点是取一个数据和0,而终点又是在数据中直接取两个,到底哪个数据是X坐标,哪个数据是Y坐标?
处理后的数据中0、20、40。。。是什么东西?Y坐标吗?为什么要用点表表示?
最后你还是没有说你到底是要做什么
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-11-27 08:46 , Processed in 0.166785 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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