找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1875|回复: 18

[教学] Spline折线模拟

[复制链接]

已领礼包: 593个

财富等级: 财运亨通

发表于 2014-11-20 14:26:36 | 显示全部楼层 |阅读模式

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

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

×
老生常谈,以前的一个讨论
http://bbs.xdcad.net/forum.php?mod=viewthread&tid=586722
后来综合了一个,但是源码丢失了,今天好不容易想起来了算法,留存
  1. (defun c:tt (/ ss e obj n pl pts ptl)
  2.   (defun _getVertex (e / pts p)
  3.     (while (and        (setq e (entnext e))
  4.                 (setq p (cdr (assoc 10 (entget e))))
  5.            )
  6.       (setq pts (cons p pts))
  7.     )
  8.     (reverse pts)
  9.   )
  10.   (if (setq ss (ssget ":S" '((0 . "spline"))))
  11.     (progn
  12.       (setq e        (ssname ss 0)
  13.             obj        (vlax-ename->vla-object e)
  14.             n        (vla-get-numberofcontrolpoints obj)
  15.       )
  16.       (setq pl (vlax-invoke
  17.                  (vla-get-modelspace
  18.                    (vla-get-activedocument (vlax-get-acad-object))
  19.                  )
  20.                  'add3dpoly
  21.                  (vlax-get obj 'ControlPoints)
  22.                )
  23.       )
  24.       (vla-put-type pl acCubicSpline3DPoly)
  25.       (setq pts (_getVertex (entlast)))
  26.       (while pts
  27.         (setq p          (vlax-curve-getclosestpointto e (car pts))
  28.               ptl (cons p ptl)
  29.               pts (cdr pts)
  30.         )
  31.       )
  32.       (vla-delete pl)      
  33.       (vlax-invoke
  34.         (vla-get-modelspace
  35.           (vla-get-activedocument (vlax-get-acad-object))
  36.         )
  37.         'add3dpoly
  38.         (apply 'append
  39.                (vl-sort        ptl
  40.                         '(lambda (x1 x2)
  41.                            (< (vlax-curve-getparamatpoint e x1)
  42.                               (vlax-curve-getparamatpoint e x2)
  43.                            )
  44.                          )
  45.                )
  46.         )
  47.       )
  48.     )
  49.   )
  50.   (princ)
  51. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 1757个

财富等级: 堆金积玉

发表于 2014-11-20 15:47:21 | 显示全部楼层
  1. (defun gm-Spl2Pl (ent tol / spt ept Lth dist pt pts)
  2.   (setq spt (vlax-curve-getStartPoint ent)
  3.         ept (vlax-curve-getEndPoint ent)
  4.         Lth (vlax-curve-getDistAtPoint ent ept)
  5.         dist 0
  6.         pts (list spt)
  7.   )
  8.   (while (< (setq dist (+ dist tol)) Lth)   
  9.     (if (setq pt (vlax-curve-getPointAtDist ent dist))
  10.       (setq pts (append pts (list pt)))
  11.     )
  12.   )
  13.   (setq pts (append pts (list ept)))
  14. )
这个虽然简单,但是貌似确实也很实用。

点评

你这个点都是等距的吧,实际上SPLINE线,应该在陡的地方点密,缓的地方点疏。  详情 回复 发表于 2014-11-20 16:07
等长时对尖角处模拟不好,较直的部分点又太密  详情 回复 发表于 2014-11-20 16:06
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2014-11-20 16:06:20 | 显示全部楼层
守仁格竹GM 发表于 2014-11-20 15:47
这个虽然简单,但是貌似确实也很实用。

等长时对尖角处模拟不好,较直的部分点又太密

自适应能力较差



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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2014-11-20 16:07:49 | 显示全部楼层
守仁格竹GM 发表于 2014-11-20 15:47
这个虽然简单,但是貌似确实也很实用。

你这个点都是等距的吧,实际上SPLINE线,应该在陡的地方点密,缓的地方点疏。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

 楼主| 发表于 2014-11-20 16:14:51 | 显示全部楼层
1楼的算法是用了 Spline  的控制点生成一个 polyline, Autocad  pedit 提供了一个 polyline 样条化功能,就是用折线模拟 Spline ,explode 后就是一段段的 line,但是这个模拟线还是和 光滑 spline 有偏离,上面程序增加了一步,取出样条化 polyline 的节点,用 getclosestpointto 到 spline 上在重新生成,全程不需要计算,就是cad的基本功能

点评

ACAD有个系统变量能控制是否用 双圆弧 模拟。  详情 回复 发表于 2014-11-20 19:06
实际上这个polyline无需炸开也可以知道那些点的。而且这个点的疏密程序跟系统的 “每条多段线曲线的线段数”这个变量设置有关。  详情 回复 发表于 2014-11-20 18:47
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

发表于 2014-11-20 18:47:32 | 显示全部楼层
本帖最后由 Highflybird 于 2014-11-20 18:48 编辑
eachy 发表于 2014-11-20 16:14
1楼的算法是用了 Spline  的控制点生成一个 polyline, Autocad  pedit 提供了一个 polyline 样条化功能, ...

实际上这个polyline无需炸开也可以知道那些点的。而且这个点的疏密程度跟系统的 “每条多段线曲线的线段数”这个变量设置有关。

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-11-20 18:58:24 | 显示全部楼层
Highflybird 发表于 2014-11-20 18:47
实际上这个polyline无需炸开也可以知道那些点的。而且这个点的疏密程度跟系统的 “每条多段线曲线的线段 ...

就是说还可以用这个变量控制疏密?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2014-11-20 19:06:48 | 显示全部楼层
eachy 发表于 2014-11-20 16:14
1楼的算法是用了 Spline  的控制点生成一个 polyline, Autocad  pedit 提供了一个 polyline 样条化功能, ...

ACAD有个系统变量能控制是否用 双圆弧 模拟。

点评

你说的是椭圆吧  详情 回复 发表于 2014-11-20 19:09
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 264个

财富等级: 日进斗金

发表于 2014-11-20 19:09:45 来自手机 | 显示全部楼层
Lisphk 发表于 2014-11-20 19:06
ACAD有个系统变量能控制是否用 双圆弧 模拟。

你说的是椭圆吧

点评

不是,是PEDIT SPLINE化的时候,用双圆弧去模拟。不过SPLINE化的曲线和真正的SPLINE还是有些出入。  详情 回复 发表于 2014-11-20 19:14
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2014-11-20 19:14:23 | 显示全部楼层
iLisp 发表于 2014-11-20 19:09
你说的是椭圆吧

不是,是PEDIT SPLINE化的时候,用双圆弧去模拟。不过SPLINE化的曲线和真正的SPLINE还是有些出入。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 19个

财富等级: 恭喜发财

发表于 2014-11-20 19:28:02 | 显示全部楼层
QQ截图20141120192348.png

取负值的时候,就是用双圆弧去模拟SPLINE
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-11-20 20:45:04 | 显示全部楼层
可能桌子看大家写的很辛苦,2015 已经提供这个转换功能
Command: _SPLINEDIT
Enter an option [Close/Join/Fit data/Edit vertex/convert to Polyline/Reverse/Undo/eXit] <eXit>: _F
Enter a fit data option
[Add/Close/Delete/Kink/Move/Purge/Tangents/toLerance/eXit] <eXit>: _P
Enter an option [Close/Join/Fit data/Edit vertex/convert to Polyline/Reverse/Undo/eXit] <eXit>: P
Specify a precision <10>:

点评

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-22 16:31 , Processed in 0.482078 second(s), 54 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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