乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 58|回复: 3

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

[复制链接]

8

主题

17

帖子

3

银币

初来乍到

Rank: 1

铜币
49
发表于 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 (3dPoints (plst / n 2dPt)
  142. (setq n     (length plst))
  143.   (repeat n
  144.     (setq plst (append plst
  145.                        (list (list 11
  146.                                    (float (car (car plst)))
  147.                                    (float (cdr (car plst)))
  148.                                    0.0
  149.                              )
  150.                        )
  151.                )
  152.           plst (cdr plst)
  153.     )
  154.   )
  155.   plst
  156. )
  157. ;;;;;;;;;;;;;;;;;;;;;;;;
  158. ;;;   断面轮廓线绘制   
  159. ;;;;;;;;;;;;;;;;;;;;;;;;
  160. (defun VD:draw (ptLst / dLst p1 p2 a1)
  161.   (setq        dLst nil
  162.         dLst (VD:2dPoints->3dPoints (cdr (cadr ptLst)))
  163.         p1   (cdr (car dLst))
  164.         p2   (cdr (last dLst))
  165.         dLst (cdr (vl-remove (last dLst) dLst))
  166.   )
  167.   (princ (reverse dLst))
  168.   (command ".spline" p2 p1 "" "" "")
  169.   (setq a1 (reverse (entget (ssname (ssget "L") 0))))
  170.   (princ a1)
  171.   (setq a1 (reverse (append (list (car a1))
  172.                             dLst
  173.                             (cdr a1)
  174.                     )
  175.            )
  176.   )
  177.   (setq a1 (entmod a1))
  178.   (princ a1)
  179.   (setq        dLst    (VD:2dPoints->3dPoints (cdr (caddr ptLst)))
  180.         p1        (cdr(car dLst))
  181.         p2        (cdr(last dLst))
  182.         dLst    (cdr (vl-remove (last dLst) dLst))
  183.   )
  184.   (princ (reverse dLst))
  185.   (command ".spline" p2 p1 "" "" "")
  186.   (setq        a1 (reverse (entget (ssname (ssget "L") 0))))
  187.   (princ a1)
  188.   (setq        a1 (reverse (append (list (car a1))
  189.                             dLst
  190.                             (cdr a1)
  191.                     )
  192.            )
  193.   )
  194.   (setq a1 (entmod a1))
  195.   (princ a1)
  196.   (setq        p1 (VD:2dPoint->3dPoint (car(cdr (cadr ptLst))))
  197.         p2 (VD:2dPoint->3dPoint (car(cdr (caddr ptLst))))
  198.   )
  199.   (command ".line" p1 p2 "")
  200.   (setq        p1 (VD:2dPoint->3dPoint (last (cdr(cadr ptLst))))
  201.         p2 (VD:2dPoint->3dPoint (last (cdr(caddr ptLst))))
  202.   )
  203.   (command ".line" p1 p2 "")
  204.   (setq        p1 (VD:2dPoint->3dPoint (car(cdr (cadr ptLst))))
  205.         p2 (VD:2dPoint->3dPoint (last (cdr(caddr ptLst))))
  206.   )
  207.   (VD:coordinate_drawing p1  p2 20.0 2)
  208. )
  209. ;;;;;;;;;;;;;;;;;;;;;;;;
  210. ;;;   断面尺寸标注      
  211. ;;;;;;;;;;;;;;;;;;;;;;;;
  212. (defun VD:ddim (ptLst ratio / pt tp ptlst1 i)
  213.   (setq        ptlst1           (cdr (cadr ptLst))
  214.         i           (length ptlst1)
  215.         textHeight (* ratio 3.0)
  216.   )
  217.   (repeat i
  218.     (setq
  219.       pt     (vd:2dPoint->3dPoint (car ptlst1))
  220.       tp     (polar (list 10.0 (cadr pt) 0.0) (/ pi 2) (* ratio 1.0))
  221.       ptlst1 (cdr ptlst1)
  222.       str    (rtos (car pt) 2)
  223.     )
  224.     (if        (= (rem (cadr pt) 20.0) 0.0)
  225.       (progn
  226.         (command "text" tp textHeight 0.0 str "")
  227.         (vd:arrow pt 0 ratio)
  228.       )
  229.       (progn
  230.         (setq p1 (list 0.0 (cadr pt) 0.0)
  231.               p2 (polar p1 0 (car pt))
  232.         )
  233.         (command "dim1" "Hor" p1 pt p2 "")
  234.         (setq p1 (list (car pt) 0.0 0.0)
  235.               p2 (polar p1 (/ pi 2) (cadr pt))
  236.         )
  237.         (command "dim1" "Ver" p1 pt p2 "")
  238.       )
  239.     )
  240.   )
  241.   (setq        ptlst1 (cdr (caddr ptLst))
  242.         i      (length ptlst1)
  243.   )
  244.   (repeat i
  245.     (setq
  246.       pt     (vd:2dPoint->3dPoint (car ptlst1))
  247.       tp     (polar (list 280 (cadr pt) 0.0) (/ pi 2) (* ratio 1.0))
  248.       ptlst1 (cdr ptlst1)
  249.       str    (rtos (car pt) 2)
  250.     )
  251.     (if        (= (rem (cadr pt) 20.0) 0.0)
  252.       (progn
  253.         (command "text" tp textHeight 0.0 str "")
  254.         (vd:arrow pt 0 ratio)
  255.       )
  256.       (progn
  257.         (setq p1 (list (car pt) 0.0 0.0)
  258.               p2 (polar p2 180 30.0)
  259.         )
  260.         (command "dim1" "Ver" p1 pt p2 "")
  261.         (setq p1 (list 0.0 (cadr pt) 0.0)
  262.               p2 (polar p1 0 (car pt))
  263.         )
  264.         (command "dim1" "Hor" p1 pt p2 "")
  265.       )
  266.     )
  267.   )
  268. )
  269. ;;;;;;;;;;;;;;;;;;;;;;;;
  270. ;;;        主程序      
  271. ;;;;;;;;;;;;;;;;;;;;;;;;
  272. (defun c:VD()
  273.     (setq scmdecho (getvar "cmdecho"))
  274.     (setvar "cmdecho" 0)
  275.     (setq ptLst        nil
  276.           ptLst        (VD:dataInput)
  277.           ptLst        (VD:dataProcessing ptLst 20.0)
  278.           n        (length ptLst)
  279.           i        1
  280.           ratio 2
  281.           a        (* ratio 50.0)
  282.     )
  283.   (repeat n
  284.     (setq pptLst (assoc i ptLst)
  285.           i         (1+ i)
  286.     )
  287. ;;;    确定作图区域(左上角点与右下角点)
  288.     (setq leftTop     (vd:2dPoint->3dPoint (last (caddr pptLst)))
  289.           rightBottom (vd:2dPoint->3dPoint (cadr (caddr pptLst)))
  290.           rightBottom (list (+ (car rightBottom) a) 0.0 0.0)
  291.           leftTop     (list 0.0 (+ (* a 0.5) (cadr leftTop)) 0.0)
  292.           newOriginal (list (car rightBottom) 0.0 0.0)
  293.     )
  294.     (VD:draw pptLst)
  295.     (VD:ddim pptLst 2.0)
  296.     (command "ucs" "m" newOriginal)
  297.   )
  298.   (command "ucs" "")
  299. ;;;    (VD:dataOut )
  300.     (setvar "cmdecho" scmdecho)
  301. )

数据文件如下:
回复

使用道具 举报

26

主题

3072

帖子

10

银币

社区元老

Rank: 75Rank: 75Rank: 75

铜币
3177
发表于 2003-12-3 18:36:00 | 显示全部楼层
你的数据是什么格式,,,
看完你的数据处理以后,看那些结果,不知道你到底是要做什么?
能否详细说说你具体是要做什么?
回复

使用道具 举报

8

主题

17

帖子

3

银币

初来乍到

Rank: 1

铜币
49
发表于 2003-12-4 10:19:00 | 显示全部楼层
是纯文本格式的,一个断面有两条样条曲线,每行中的数据是一条样条曲线的数据,第一个数据表示第几个断面.第二个数据是样条曲线所在侧的识别号.这里只有正和反两侧.0表示正,1表示反.剩下的全是曲线上的点的数据.这里有个特殊情况,就是中间各个点的y间距是相等的,在程序中用了space变量就是这个间距。比如第一组,起点是(269.51 0.0) 终点是(122.14 251.66),中间的数据全部是各个点的坐标的数据。读入进行数据处理以后得到的数据序列如下
当然,这里我用了3组同样的断面数据,因为这些数据还是我自己整理出来的,总共有20多个,我只是想测试一下,应该完全可以的。
不好意思,太麻烦你了,我先谢谢了!
回复

使用道具 举报

26

主题

3072

帖子

10

银币

社区元老

Rank: 75Rank: 75Rank: 75

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

使用道具 举报

发表回复

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

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2025-7-7 09:30 , Processed in 0.317226 second(s), 61 queries .

© 2020-2025 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表