找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2815|回复: 9

[求助] 如何把一个SPLINE用多段线模拟出来?

[复制链接]

已领礼包: 19个

财富等级: 恭喜发财

发表于 2013-5-27 08:52:44 | 显示全部楼层 |阅读模式

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

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

×


自己的程序中想处理一些SPLINE,用多段线模拟出来,现在遇到问题,到底用什么控制比较好,既能让多段线看着比较贴,顶点数又不至于过多,因为过多的顶点以后处理起来也不方便,考虑到图是可能任意比例画的,指定具体的段数不太能适合各种情况。希望各位高手指点。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-5-27 09:36:44 | 显示全部楼层
我觉得吧,在SPLINE比较缓的地方,顶点数可以少,在比较陡的地方,顶点数要多,应该用 相邻多段线顶点的中点到SPLINE的最短距离控制。这个距离是多少合适,你在考虑下。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2013-5-27 09:50:17 | 显示全部楼层
贴一个简单的,Spline和Ellipse转多段线的代码:
  1. (defun Spl_Ell2Lwp (ename)
  2.   (command "._Dxfout"
  3.            (setq tmpfile (vl-filename-mktemp nil nil ".dxf"))
  4.            "_Objects"
  5.            ename
  6.            ""
  7.            "_Version"
  8.            "_R12"
  9.            "_Binary"
  10.            )
  11.   (entdel ename)
  12.   (command "._Dxfin" tmpfile)
  13.   (entlast)
  14.   )

上述代码没有考虑到点的密度优化!
我觉得吧,用顶点数控制点的密度,不能符合任意比例图的情况!最好是以各顶点间切线方向的转角差来控制比较理想!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2013-5-27 09:56:19 | 显示全部楼层
大部分的 Lisp 模拟都是采用了等分处理,这样的处理很多时候效果不是很理想,曾经看过一个Arx的模拟,大致思路是根据显示模式计算一个矢高进行模拟, 以前用另外一种算法写过一个,不过找不到源码了,只有一个 vlx。思路是这样的:取得 Spline 的控制点,对控制点间的每段进行等分,然后由这些等分点向 spline 求 vlax-curve-getclosestpointto ,最后用这些点组成 pline 模拟,你用这个和直接求等分点的进行比较比较就看出差别了

s2p.rar

2.2 KB, 下载次数: 36, 下载积分: D豆 -1 , 活跃度 1

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

使用道具 举报

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

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2013-5-27 11:29:00 | 显示全部楼层
cy956 发表于 2013-5-27 10:38
这个问题晓东在10多年前就贴过,可以问他!

你记忆力咋这好,10年前的还记得,确定我说过吗:P

晓东工具箱3.0里面就有了曲线互转工具,在曲线菜单下。

做个演示:

                               
登录/注册后可看大图



XDRX_API提供函数:xdrx_getsamplept,对SPLINE用的“玄高差”来模拟。

  1. xdrx_getsamplept

  2. 功    能:按给定精度,返回AcDbCurve类曲线和AcDb2dPolyline(旧的POLYLINE)的样本点。
  3.           将复杂的曲线用点组成的线段模拟。

  4. 调用格式:(xdrx_getsamplept <AcDbCurve 或 AcDb2dPolyline实体图元名> [精度控制])

  5. 说    明:给定的[精度控制]值玄高差越小,精度越高,分段数越大,精度越高。
  6.           精度控制只对曲线段有效,对于POLYLINE,对直线段无效,对其中的ARC段数据起做用。

  7.           若不给[精度控制]参数,那么程序自己计算出相对满足视觉误差的值做为玄高差进行分段。

  8.           [精度控制]:分两种方法
  9.                         1:给整数,按给定的整数分曲线段
  10.                         2:给实数,做为玄高差

  11. 注    意:对于AcDbSpline,只能给定"玄高差",若给整数值,那么程序按照计算的相对最优值做为玄高差。

  12. 返 回 值:若成功,返回点表,点表肯定包括曲线的开始点和终止点。(p1 p2......),失败返回NIL.

  13. 示    例:用LINE模拟SPLINE
  14.             (if (setq en (xdrx_entsel "\n请点取一个Spline<退出>:") '((0 . "spline"))))
  15.                 (progn
  16.                     (setq ed (xdrx_getsamplept (car en)))
  17.                     (apply 'command (cons "line" ed))
  18.                     (command "")
  19.                 )
  20.             )
不过,现在VLISP这么强大了,还是希望大家讨论下,怎么用VLISP写个通用的模拟SPL的函数出来。 算法很清晰,大家也可以想想其他的算法。

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

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2013-5-27 11:48:25 | 显示全部楼层
用我的算法和 ARX 的比较,在拐弯处自动加密了,应该是非常接近 Arx 的一种方式
这个是绘制控制点的Pline,对已经拟合过的spline就没有模拟意义了,这个等分s2p好像是取的8等分,一般这个精度就够了,再密对相对类直线部分就有些密了,当然如果对取得的 GetClosestPointTO 点集再行处理一下就更完美了
[pcode=lisp,true]
(defun c:tt (/ e el pts os)
  (if (setq e (car (entsel)))
    (progn
      (setq os (getvar "osmode"))
      (setvar "osmode" 0)
      (setq el    (entget e)
        pts    (mapcar    'cdr
            (vl-remove-if-not '(lambda (x) (= (car x) 10)) el)
        )
      )
      (apply 'vl-cmdf (cons ".pline" pts))
      (vl-cmdf "c")
      (setvar "osmode" os)
    )
  )
  (princ)
)[/pcode]

上图是 s2p 处理,下图为API处理

上图是 s2p 处理,下图为API处理

算法示意

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

使用道具 举报

已领礼包: 51个

财富等级: 招财进宝

发表于 2013-5-27 12:07:04 | 显示全部楼层
eachy 发表于 2013-5-27 11:48
用我的算法和 ARX 的比较,在拐弯处自动加密了,应该是非常接近 Arx 的一种方式
这个是绘制控制点的Pline ...

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-5-27 12:30:08 | 显示全部楼层
eachy 发表于 2013-5-27 11:48
用我的算法和 ARX 的比较,在拐弯处自动加密了,应该是非常接近 Arx 的一种方式
这个是绘制控制点的Pline ...

我觉得吧,像下面这图,两个SPLINE,肯定不应该同样的处理方法,一个要求精度相对高些,小的那个就差些。

EACHY大师的切线法也好,还是“玄高差“也好,其实是一样的,都是转化为一个点处的多段线和这个点处的切线夹角要小于一个数值,这个数值是多少,应该根据具体要求可大可小,对小的SPLINE能满足精度,对大的也能。
QQ截图20130527122545.png
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2013-5-27 12:40:18 | 显示全部楼层
大家看看下面这个图,一个是源SPLINE,顶点多的是这个SPLINE偏移0.1后得到的,还是SPLINE,看看ADESK做出的SPLINE,顶点数变了,看看这个顶点的分布,能不能有什么启示。

QQ截图20130527123636.png


测试图

请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:新块.rar 
下载次数:1  文件大小:9.11 KB 
下载权限: 不限 以上  [免费赚D豆]


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-9-25 14:37 , Processed in 0.390741 second(s), 52 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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