找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: wkai

[分享]:spline->pl的高效代码

[复制链接]
发表于 2004-1-12 00:29:34 | 显示全部楼层
是否还要加入曲率变化判断?
或者判断p1p2曲线长度与直线长度的关系?
这个问题再发展下去,是不是也要来个“优选法”模型?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-1-12 00:40:27 | 显示全部楼层
最初由 cy956 发布
[B]是否还要加入曲率变化判断?
或者判断p1p2曲线长度与直线长度的关系?
这个问题再发展下去,是不是也要来个“优选法”模型? [/B]


曲率和半径是没关系的,所以大圆和小圆等分下去是一样的(份数)
这就失去了意义.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2004-1-12 09:58:40 | 显示全部楼层
这段代码的特点是能够根据曲线的曲率分配顶点数,曲率变化大的地方顶点的密度大。

  1.   [FONT=courier new]
  2. ;__2004.01.12.09.43_____________________________________
  3. ;__样条曲线--〉复义线___BY__WKAI__晓东CAD论坛___________
  4. (defun c:tt (/ pts min_distacne vlo st_par ed_par ent n max_angle_rad max_an)
  5.   (setq        vlo              (vlax-ename->vla-object (setq ent (car (entsel "\n选择spline:"))))
  6.         st_par              (vlax-curve-getstartparam vlo)
  7.         ed_par              (vlax-curve-getendparam vlo)
  8.         pts              (list (vlax-curve-getstartpoint vlo))
  9.         max_angle     (if (setq        max_an (getreal        (strcat        "\n许可角度误差<"
  10.                                                         (if max_angle
  11.                                                           (rtos max_angle 2 2)
  12.                                                           (rtos (setq max_angle 5) 2 2)
  13.                                                         )
  14.                                                         ">:"
  15.                                                 )
  16.                                        )
  17.                           )
  18.                         max_an
  19.                         max_angle
  20.                       )
  21.         max_angle_rad (* pi (/ max_angle 180.0)) ;_最大许可误差角度弧度
  22.   )
  23.   (setq zhf_time_dot nil)
  24.   (z_timer)
  25.   (t1 vlo st_par ed_par)
  26.   (command "pline")
  27.   (foreach n pts (command "non" n))
  28.   (command)
  29.   (princ (strcat "\n创建一条顶点数为" (itoa (length pts)) "的复义线。"))
  30.   (princ (z_timer))
  31.   (princ)
  32. )
  33. ;________________________________________________________
  34. ;________________________________________________________
  35. (defun t1 (vl_obj start_par end_par / dis_m_m ed_p ed_pt mid_p mid_pt mid_pt_vlo st_p st_pt)
  36.   (setq        st_p           start_par
  37.         ed_p           end_par
  38.         st_pt           (vlax-curve-getpointatparam vl_obj st_p)
  39.         ed_pt           (if (vlax-curve-getpointatparam vl_obj ed_p)
  40.                      (vlax-curve-getpointatparam vl_obj ed_p)
  41.                      (vlax-curve-getendpoint vl_obj)
  42.                    )
  43.         mid_p           (/ (+ st_p ed_p) 2.0)
  44.         mid_pt           (mapcar '(lambda (x y) (/ (+ x y) 2.0)) st_pt ed_pt)
  45.         mid_pt_vlo (vlax-curve-getpointatparam vl_obj mid_p)
  46.         dis_m_m           (distance mid_pt_vlo mid_pt)
  47.   )
  48.   (if (or (> (t3 ed_pt st_pt mid_pt_vlo t) max_angle_rad)
  49.           (and (< (t3 ed_pt st_pt mid_pt_vlo t) max_angle_rad)
  50.                (t2 vl_obj st_p ed_p st_pt ed_pt)
  51.           )
  52.       )
  53.     (progn
  54.       (t1 vl_obj st_p mid_p)
  55.       (t1 vl_obj mid_p ed_p)
  56.     )
  57.     (setq pts (append pts (list mid_pt_vlo) (list ed_pt)))
  58.   )
  59. )
  60. ;_____________________________________________________________
  61. (defun t2 (vl st_par ed_par s_pt e_pt / run delta_p n lst pt)
  62.   (setq        run        t
  63.         delta_p        (- ed_par st_par)
  64.         lst        '(0.0001 0.01 0.25) ;_测试采样表
  65.         n        -1
  66.   )
  67.   (while (and run (< (setq n (1+ n)) (length lst)))
  68.     (setq pt (vlax-curve-getpointatparam vl (+ st_par (* delta_p (nth n lst)))))
  69.     (if        (> (t3 e_pt s_pt pt t) max_angle_rad)
  70.       (setq run nil)
  71.     )
  72.     (if        (> (t3 s_pt e_pt pt t) max_angle_rad)
  73.       (setq run nil)
  74.     )
  75.     (setq pt (vlax-curve-getpointatparam vl (- ed_par (* delta_p (nth n lst)))))
  76.     (if        (> (t3 e_pt s_pt pt t) max_angle_rad)
  77.       (setq run nil)
  78.     )
  79.     (if        (> (t3 s_pt e_pt pt t) max_angle_rad)
  80.       (setq run nil)
  81.     )
  82.   )
  83.   (not run)
  84. )
  85. ;_____________________________________________________________
  86. (defun t3 (p1 p2 p3 rad)
  87.   (if rad
  88.     (abs (- (angle p2 p3) (angle p2 p1)))
  89.     (* 180 (/ (abs (- (angle p2 p3) (angle p2 p1))) pi))
  90.   )
  91. )
  92. ;________________________________________________________
  93. ;________________________________________________________
  94. (princ "\n样条曲线--〉复义线___BY__WKAI__晓东CAD论坛")  [/FONT]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-1-13 01:52:45 | 显示全部楼层
想问问
1.转换的意义?什么情况下需要转换
2。转换优化的方法,距离逼近好,还是角度逼近好,曲率控制?其它的方法?
3.角度控制和曲率控制等同么?

另,没仔细看完程序,问wkai,'(0.0001 0.01 0.25) ;_测试采样表
是采样时候的分级取点用的么?也就是说,你是用逼近角度的方法?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 488个

财富等级: 日进斗金

发表于 2004-1-14 00:08:14 | 显示全部楼层
最初由 wkai 发布
[B]这段代码的特点是能够根据曲线的曲率分配顶点数,曲率变化大的地方顶点的密度大。
[CODE]
  
;__2004.01.12.09.43_____________________________________
;__样条曲线--〉复义线___BY__WKAI... [/B]


spline谈不上曲率,因为你测试的点天知道在哪一个弯上面,也许你的两点已经经过了好几个弯了.

我上面说了:曲率,对大的弧合小的弧是一样的(和半径无关)
所以长1000的线和1的线,等分下去是一样的.

其实就是个模拟,大差不差就行了(不可能讲"正确")
也就是要用尽量少的点,来模拟出适合你要求精度的线来.
精度可以设,关键是取点.

其实规定:一天要三个苹果的营养,你要是吃三个苹果吧,可能营养不够,你要吃到那么多营养吧,又不知道是几个.因为规定就是个模糊概念.
这里的模拟本身就是个模糊的事情,挑3个中等大小的吃了就可以了,当然吃3个大的更好(有时就浪费),当你在考虑苹果的产地时,就复杂了.



我的方法是:吃一个,吃到小的再吃一个。( 好象精度不够:)  )
你的方法:拨一半,看多了,再拨...
当然还可以:切碎,用天平:) 我看没必要了吧.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-1-24 21:32:09 | 显示全部楼层
对于以上同志提出的解答,本人深表谢意。该程序正式我想要的代码。谢谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2004-1-26 19:22:11 | 显示全部楼层
为什么没一个帖子模拟的时候用bulge?不好用么?还是有什么缺陷?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-9-8 12:17 , Processed in 0.351191 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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