找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 2495|回复: 15

[原创] Spline精确包围盒改进

[复制链接]

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-12-6 14:44:00 | 显示全部楼层 |阅读模式

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

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

×
ARX http://bbs.xdcad.net/thread-677927-1-1.html
原讨论帖  http://bbs.xdcad.net/thread-671782-1-1.html
改进算法
返回值为 WCS 点(当前 UCS 下盒子)
  1. (defun Spline:Box (obj / cpts vec p1 p2 p4 p3 lst xdir ydir)
  2.   (setq        cpts (mapcar
  3.                'cdr
  4.                (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget obj))
  5.              )
  6.         p1   (apply 'mapcar (cons 'min cpts))
  7.         p3   (apply 'mapcar (cons 'max cpts))
  8.   )
  9.   (if (zerop (getvar "worlducs"))
  10.     (setq vec  (mapcar '- p3 p1)
  11.           p2   (mapcar '+ p1 (list (car vec) 0.0 0.0))
  12.           p4   (mapcar '+ p1 (list 0.0 (cadr vec) 0.0))
  13.           lst  (list
  14.                  (trans p1 0 1)
  15.                  (trans p2 0 1)
  16.                  (trans p3 0 1)
  17.                  (trans p4 0 1)
  18.                )
  19.           p1   (trans (apply 'mapcar (cons 'min lst)) 1 0)
  20.           p3   (trans (apply 'mapcar (cons 'max lst)) 1 0)
  21.           xdir (getvar "ucsxdir")
  22.           ydir (getvar "ucsydir")
  23.     )
  24.     (setq xdir '(1.0 0.0 0.0)
  25.           ydir '(0.0 1.0 0.0)
  26.     )
  27.   )
  28.   (setq
  29.     lst        (mapcar        '(lambda (a b)
  30.                    (vlax-curve-getClosestPointToProjection obj a b t)
  31.                  )
  32.                 (list p1 p1 p3 p3)
  33.                 (list xdir ydir xdir ydir)
  34.         )
  35.   )
  36.   (if (zerop (getvar "worlducs"))
  37.     (setq lst (mapcar '(lambda (x) (trans x 0 1)) lst))
  38.   )
  39.   (setq        p1 (apply 'mapcar (cons 'min lst))
  40.         p3 (apply 'mapcar (cons 'max lst))
  41.   )
  42.   (mapcar '(lambda (x) (trans x 1 0))
  43.           (list        p1
  44.                 (list (car p1) (cadr p3) (caddr p1))
  45.                 p3
  46.                 (list (car p3) (cadr p1) (caddr p1))
  47.           )
  48.   )
  49. )

测试程序
  1. (defun c:tt (/ e)
  2.   (while (setq e (car (xdrx_entsel "\nPick spline: ")))
  3.     (apply 'xdrx_polyline_make (cons t (spline:box e)))
  4.   )
  5.   (princ)
  6. )

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

已领礼包: 604个

财富等级: 财运亨通

发表于 2014-12-8 19:57:27 来自手机 | 显示全部楼层
对椭圆、弧有效吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-12-8 19:59:13 | 显示全部楼层

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

使用道具 举报

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

使用道具 举报

已领礼包: 1757个

财富等级: 堆金积玉

发表于 2014-12-9 10:35:55 | 显示全部楼层
不是最小包围框,钢结构工具箱里面有,不知道怎么计算的

点评

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

使用道具 举报

已领礼包: 1757个

财富等级: 堆金积玉

发表于 2014-12-9 10:41:49 | 显示全部楼层
钢结构工具箱貌似也不是最小,按照楼主这个旋转的话,最终结果一定比那个小

点评

最小也是用的取模拟点,再用点集去求最小 rectang , spline 本来就是用点描述的,无限逼近,没有极限 z  详情 回复 发表于 2014-12-9 11:12
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 145个

财富等级: 日进斗金

发表于 2014-12-9 10:42:59 | 显示全部楼层
守仁格竹GM 发表于 2014-12-9 10:35
不是最小包围框,钢结构工具箱里面有,不知道怎么计算的

你说的最小包围框是指什么? 截个图上来吧。

点评

如图,黄框为钢结构工具箱计算的最小外接矩形,红框为楼主函数生成的外接矩形。黄框的面积小于红框的面积 但是可以看出黄框也不是最小,没有做到外接。  详情 回复 发表于 2014-12-9 14:37
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-12-9 11:12:49 | 显示全部楼层
守仁格竹GM 发表于 2014-12-9 10:41
钢结构工具箱貌似也不是最小,按照楼主这个旋转的话,最终结果一定比那个小

最小也是用的取模拟点,再用点集去求最小 rectang , spline 本来就是用点描述的,无限逼近,没有极限
z
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1757个

财富等级: 堆金积玉

发表于 2014-12-9 14:37:06 | 显示全部楼层
XDSoft 发表于 2014-12-9 10:42
你说的最小包围框是指什么? 截个图上来吧。

如图,黄框为钢结构工具箱计算的最小外接矩形,红框为楼主函数生成的外接矩形。黄框的面积小于红框的面积

但是可以看出黄框也不是最小,没有做到外接。

对比.png

点评

黄的应该是凸包最小面积矩形了,试试用 xdrx_points_minareabox or xdrx_points_minbox 求下看看。  详情 回复 发表于 2014-12-9 15:10
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-12-9 14:55:15 | 显示全部楼层
本帖最后由 st788796 于 2014-12-9 14:57 编辑
守仁格竹GM 发表于 2014-12-9 14:37
如图,黄框为钢结构工具箱计算的最小外接矩形,红框为楼主函数生成的外接矩形。黄框的面积小于红框的面积 ...

  1. (defun c:tt (/ e pts box)
  2.   (if (setq e (car (xdrx_entsel "\npick spline: " '((0 . "spline")))))
  3.     (progn
  4.       (setq pts        (xdrx_getsamplept e 1e-5)
  5.             box        (xdrx_points_minareabox pts)
  6.       )
  7.       (apply 'xdrx_polyline_make (cons t box))
  8.     )
  9.   )
  10.   (princ)
  11. )


这个已经非常接近了,如果嫌不精确
1 再增加采样点密度
2 将这个 BOX 外偏后再用 1 楼方法求精确的盒子

点评

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-12-9 15:10:09 | 显示全部楼层
守仁格竹GM 发表于 2014-12-9 14:37
如图,黄框为钢结构工具箱计算的最小外接矩形,红框为楼主函数生成的外接矩形。黄框的面积小于红框的面积 ...

黄的应该是凸包最小面积矩形了,试试用 xdrx_points_minareabox or xdrx_points_minbox 求下看看。

点评

xdrx_points_minareabox or xdrx_points_minbox 这两个函数没找到呢,加载API没有亮显,帮助也没搜索到,网站也没搜索到  详情 回复 发表于 2014-12-9 16:37
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-12-9 15:12:07 | 显示全部楼层
st788796 发表于 2014-12-9 14:55
这个已经非常接近了,如果嫌不精确
1 再增加采样点密度
2 将这个 BOX 外偏后再用 1 楼方法求精确的 ...

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

使用道具 举报

已领礼包: 1757个

财富等级: 堆金积玉

发表于 2014-12-9 16:37:09 | 显示全部楼层
newer 发表于 2014-12-9 15:10
黄的应该是凸包最小面积矩形了,试试用 xdrx_points_minareabox or xdrx_points_minbox 求下看看。

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-12-9 16:42:31 来自手机 | 显示全部楼层
守仁格竹GM 发表于 2014-12-9 16:37
xdrx_points_minareabox or xdrx_points_minbox
这两个函数没找到呢,加载API没有亮显,帮助也没搜索到 ...

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

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-12-10 07:51:10 | 显示全部楼层
本帖最后由 st788796 于 2014-12-10 07:54 编辑
守仁格竹GM 发表于 2014-12-9 10:41
钢结构工具箱貌似也不是最小,按照楼主这个旋转的话,最终结果一定比那个小

写了一个对比,用采样点求最小面积包围盒后再扩展求真实包围盒
  1. (defun c:tt (/ e pts box nbox vx vy lst area1 area2)
  2.   (if (setq e (car (xdrx_entsel "\npick spline: " '((0 . "spline")))))
  3.     (progn
  4.       (setq pts          (xdrx_getsamplept e 1e-4)
  5.             box          (xdrx_points_minareabox pts)
  6.             nbox  (apply 'xdrx_points_offset
  7.                          (cons (distance (car box) (cadr box))
  8.                                (xd::pnts:close box)
  9.                          )
  10.                   )
  11.             vx          (mapcar '- (cadr nbox) (car nbox))
  12.             vy          (mapcar '- (last nbox) (car nbox))
  13.             area1 (apply 'xdrx_points_area box)
  14.       )
  15.       (xdrx_entity_setcolor
  16.         (apply 'xdrx_polyline_make (cons t box))
  17.         1
  18.       )
  19.       (setq lst          (mapcar
  20.                     '(lambda (a b)
  21.                         (vlax-curve-getClosestPointToProjection e a b t)
  22.                        ;;(xdrx_curve_getclosestpoint e a b)
  23.                      )
  24.                     (list (car nbox) (car nbox) (caddr nbox) (caddr nbox))
  25.                     (list vx vy vx vy)
  26.                   )
  27.             lst          (list
  28.                     (inters (car lst)
  29.                             (mapcar '+ (car lst) vx)
  30.                             (cadr lst)
  31.                             (mapcar '+ (cadr lst) vy)
  32.                             nil
  33.                     )
  34.                     (inters (car lst)
  35.                             (mapcar '+ (car lst) vx)
  36.                             (last lst)
  37.                             (mapcar '+ (last lst) vy)
  38.                             nil
  39.                     )
  40.                     (inters (last lst)
  41.                             (mapcar '+ (last lst) vy)
  42.                             (caddr lst)
  43.                             (mapcar '+ (caddr lst) vx)
  44.                             nil
  45.                     )
  46.                     (inters (caddr lst)
  47.                             (mapcar '+ (caddr lst) vx)
  48.                             (cadr lst)
  49.                             (mapcar '+ (cadr lst) vy)
  50.                             nil
  51.                     )
  52.                   )
  53.             area2 (apply 'xdrx_points_area lst)
  54.       )
  55.       (xdrx_entity_setcolor
  56.         (apply 'xdrx_polyline_make (cons t lst))
  57.         2
  58.       )
  59.       (xdrx_msgbox
  60.         (strcat        "采样矢高为 0.001\n"
  61.                 "采样点数量 = "
  62.                 (itoa (length pts))
  63.                 "\nXdRx_Points_MinAreaBox 面积 = "
  64.                 (rtos area1 2 6)
  65.                 "\n扩展后真实包围盒面积 = "
  66.                 (rtos area2 2 6)
  67.                 "\n误差 = "
  68.                 (rtos (* (/ (- area2 area1) area1) 100.) 2 6)
  69.                 "%"
  70.         )
  71.         "面积对比"
  72.         4
  73.         0
  74.       )
  75.     )
  76.   )
  77.   (princ)
  78. )
20141210074655.jpg

点评

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-15 05:24 , Processed in 0.450551 second(s), 60 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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