找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1440|回复: 2

[教学] XDGE几何库应用(29)--平面点集外接最小面积矩形

[复制链接]

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-11-4 13:49:19 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 st788796 于 2014-11-4 13:51 编辑

函数见 http://bbs.xdcad.net/thread-676796-1-1.html
  1. ;;逆时针凸包点集
  2. (defun XD::Pnts:MinRectang (pts          /        _pnt->2d    marea ptl        tan
  3.                             v1          p1        p2    p3    ydir  rec        lst
  4.                             area  box        v2 i
  5.                            )
  6.   (defun _drawbox (pts col /)
  7.     (apply 'xdrx_grdraw
  8.            (cons
  9.              col
  10.              (cons 1
  11.                    (list (car pts)
  12.                          (mapcar '+ (car pts) (cadr pts))
  13.                          (apply 'mapcar (cons '+ pts))
  14.                          (mapcar '+ (car pts) (caddr pts))
  15.                          (car pts)
  16.                    )
  17.              )
  18.            )
  19.     )
  20.   )
  21.   (defun _pnt->2d (p) (list (car p) (cadr p)))
  22.   (if (<= (length pts) 2)
  23.     pts
  24.     (progn
  25.       (setq pts          (xdrx_points_gethull pts) ;_2007+
  26.             pts          (mapcar '(lambda (x) (_pnt->2d x)) pts)
  27.             marea 1e328
  28.             ptl          pts
  29.             tan          (/ pi 2)
  30.             v1          (mapcar '- (cadr pts) (car pts))
  31.             i 0
  32.       )
  33.       (while (and
  34.                (> (length ptl) 2)
  35.                (< (xdrx_vector_angle
  36.                     v1
  37.                     (setq v2 (mapcar '- (cadr ptl) (car ptl)))
  38.                   )
  39.                   tan
  40.                )
  41.              )
  42.         (setq ydir (xdrx_vector_product
  43.                      (xdrx_vector_normalize (xdrx_vector_perpvector v2))
  44.                      (abs (xdrx_point_dist2line
  45.                             (caddr ptl)
  46.                             (car ptl)
  47.                             (cadr ptl)
  48.                           )
  49.                      )
  50.                    )
  51.               rec  (xdge::constructor "kBoundBlock2d" (car ptl) v2 ydir);_以一个边为 x轴,第三个点构造斜向bound
  52.         )
  53.         (foreach x pts
  54.           (xdge::setpropertyvalue rec "extend" x);_把所有点加入 boundblock,自动扩充
  55.         )
  56.         (setq lst  (xdge::getpropertyvalue rec "get");_boundblock 信息,基点、x轴向量、y轴向量
  57.               area (* (xdrx_vector_length (cadr lst));_边长
  58.                       (xdrx_vector_length (caddr lst));_边长
  59.                    )
  60.         )
  61.         (_drawbox lst (setq i (1+ i)))
  62.         (princ "\nColor ")
  63.         (princ i)
  64.         (princ " Rectang Area = ")
  65.         (princ (rtos area 2 5))
  66.         (if (< area marea)
  67.           (setq        marea area
  68.                 box   lst
  69.           )
  70.         )
  71.         (setq ptl (cdr ptl))
  72.       )
  73.       (xdge::free)
  74.       (list (car box)
  75.             (mapcar '+ (car box) (cadr box))
  76.             (apply 'mapcar (cons '+ box))
  77.             (mapcar '+ (car box) (caddr box))
  78.       )
  79.     )
  80.   )
  81. )
  82. (defun c:tt (/ pts)
  83.   (setq
  84.     pts        (XD::pnts:minrectang
  85.           (mapcar '(lambda (x) (xdrx_getpropertyvalue x "position"))
  86.                   (xdrx_pickset->ents (ssget '((0 . "point"))))
  87.           )
  88.         )
  89.   )
  90.   ;;(apply 'xdrx_polyline_make (cons t pts))
  91.   (princ)
  92. )
minrectang.gif

本帖被以下淘专辑推荐:

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

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-11-4 20:52:08 | 显示全部楼层
本帖最后由 newer 于 2014-11-4 20:53 编辑

这个可高级,代码还那么短,去掉那些显示修饰的代码部分,也就2,30行吧,能给讲讲算法的思路吗?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1268个

财富等级: 财源广进

 楼主| 发表于 2014-11-4 21:09:22 | 显示全部楼层
本帖最后由 st788796 于 2014-11-4 21:12 编辑
newer 发表于 2014-11-4 20:52
这个可高级,代码还那么短,去掉那些显示修饰的代码部分,也就2,30行吧,能给讲讲算法的思路吗?

旋转卡壳方法在网上和 算法与数据库论坛都有很多介绍,不再多述,这个方法中以一条边作为矩形的所在边去构造一个点集的盒子,在 AcGe 库中用 BoundBlock2d 简化这个构造矩形方法,初始 BoundBlock2d 如图中虚线所示,然后用 foreach 语句将其他点 extend 进 boundblock2d 后,最终形成外面实线框,算完第一条边然后算第二个 ... 比较下面积哪个最小,记录下来

逆时针方向点集可以保证 用边计算垂向量时始终指向凸包内部

AcGeBoundBlock2d/3d 详细介绍可以参考
http://bbs.xdcad.net/forum.php?mod=viewthread&tid=676122&ctid=26

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-30 19:11 , Processed in 0.455316 second(s), 37 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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