找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1540|回复: 1

[点表] (XD::Pnts:MinRectang)平面点集最小面积矩形

[复制链接]

已领礼包: 1268个

财富等级: 财源广进

发表于 2014-11-4 11:48:00 | 显示全部楼层 |阅读模式
函数发布
函数名称: XD::Pnts:MinRectang
调用格式: (XD::Pnts:MinRectang pts)
参数说明: pts --- 点表
返回值: 点表
函数简介: 平面点集最小外接面积矩形
函数来源: 原创
函数作者: st788796
适用版本: XDRX API 
最后更新时间: 2014-11-04
备注: -
演示图片: -

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

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

×
  1. (defun XD::Pnts:MinRectang (pts   /            _pnt->2d        marea ptl   tan          v1
  2.                         p1    p2    p3          ydir        rec   lst   area  box
  3.                         v2
  4.                        )
  5.   (defun _pnt->2d (p) (list (car p) (cadr p)))
  6.   (if (<= (length pts) 2)
  7.     pts
  8.     (progn
  9.       (setq pts          (xdrx_points_gethull pts) ;_2007+
  10.             pts          (mapcar '(lambda (x) (_pnt->2d x)) pts)
  11.             marea 1e328
  12.             ptl          pts
  13.             tan          (/ pi 2)
  14.             v1          (mapcar '- (cadr pts) (car pts))
  15.       )
  16.       (while (and
  17.                (> (length ptl) 2)
  18.                (< (xdrx_vector_angle
  19.                     v1
  20.                     (setq v2 (mapcar '- (cadr ptl) (car ptl)))
  21.                   )
  22.                   tan
  23.                )
  24.              )
  25.         (setq ydir (xdrx_vector_product
  26.                      (xdrx_vector_normalize (xdrx_vector_perpvector v2))
  27.                      (abs (xdrx_point_dist2line
  28.                             (caddr ptl)
  29.                             (car ptl)
  30.                             (cadr ptl)
  31.                           )
  32.                      )
  33.                    )
  34.               rec  (xdge::constructor "kBoundBlock2d" (car ptl) v2 ydir)
  35.         )
  36.         (foreach x pts
  37.           (xdge::setpropertyvalue rec "extend" x)
  38.         )
  39.         (setq lst  (xdge::getpropertyvalue rec "get")
  40.               area (* (xdrx_vector_length (cadr lst))
  41.                       (xdrx_vector_length (caddr lst))
  42.                    )
  43.         )
  44.         ;;(princ "\n")
  45.         ;;(princ area)
  46.         (if (< area marea)
  47.           (setq        marea area
  48.                 box   lst
  49.           )
  50.         )
  51.         (setq ptl (cdr ptl))
  52.       )
  53.       (xdge::free)
  54.       (list (car box)
  55.             (mapcar '+ (car box) (cadr box))
  56.             (apply 'mapcar (cons '+ box))
  57.             (mapcar '+ (car box) (caddr box))
  58.       )
  59.     )
  60.   )
  61. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 264个

财富等级: 日进斗金

发表于 2014-11-4 12:50:53 来自手机 | 显示全部楼层
节省点空间可以仅构造一个Bound循环体内用set方法
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-25 14:30 , Processed in 0.374947 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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