找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 5266|回复: 24

[研讨] 点集的最小包围圆

[复制链接]

已领礼包: 1883个

财富等级: 堆金积玉

发表于 2014-12-23 17:47:58 | 显示全部楼层 |阅读模式

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

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

×
;;;求点集包容矩形对角线交点坐标p_j
(defun kcen (plst)
  (setq xlst (vl-sort (mapcar '(lambda (x)  (car x)  ) plst ) '<))
  (setq xmin (car xlst))
  (setq xmax (last xlst))
  (setq ylst (vl-sort (mapcar '(lambda (x)  (cadr x)  ) plst ) '<))
  (setq ymin (car ylst))
  (setq ymax (last ylst))
  (setq p_j (list (/ (+ xmin xmax) 2.0) (/ (+ ymin ymax) 2.0)))
  p_j
)
;;;求点集中各元素到p_j的距离,并根据距离由大到小的规则对点集排序(第一点p_1,就算最远点有多个也不影响程序正确性)
(defun p_dmax (p plst)
   (setq lst (vl-sort plst '(lambda(a b) (> (distance p a) (distance p b))) ))
   lst
)
;;;求第二点p_2
(defun fmax (p_1 p_j p)
(setq d1 (distance p_1 p_j))
(setq d2 (distance p_1 p))
(setq d3 (distance p_j p))
(setq dn (/ (* d2 d2 d1) (+ (* d1 d1) (* d2 d2) (* d3 d3 -1))  ))
dn
)
(defun pfmax (p_1 p_j plst)
   (setq lst (vl-sort plst '(lambda(a b) (> (fmax p_1 p_j a) (fmax p_1 p_j b))) ))
   lst
)
;;;求第三点
(defun cc (p_1 p_2 p)
(setq d1 (distance p_1 p))
(setq d2 (distance p_2 p))
(setq d3 (distance p_1 p_2))
(setq cosa (/ (+ (* d1 d1) (* d2 d2) (* d3 d3 -1)) (* d1 d2 2) ))
cosa
)
(defun tmax (p_1 p_2 plst)
   (setq lst (vl-sort plst '(lambda(a b) (> (cc p_1 p_2 a) (cc p_1 p_2 b) )) ))
    lst
)
;;;取点函数
(defun fp ()
    (setq sn (ssget ":N" '((0 . "point"))))
    (setq i 0 n (sslength sn) plst nil)
    (while (< i n)
        (setq plst (cons (cdr (assoc 10 (entget (ssname sn i)))) plst))
         (setq i (+ i 1))
    )
    plst
)
(defun c:fmin()
(setq plst (fp))
(setq p_j (kcen plst))
(setq p_1 (car (p_dmax p_j plst)))
(setq p_2 (car (pfmax p_1 p_j (vl-remove p_1 plst))))
(setq p_3 (car (tmax p_1 p_2 (vl-remove p_2 (vl-remove p_1 plst)))))
(if (< (cc p_1 p_2 p_3) 0)
       (progn
         (command "circle" "2p" p_1 p_2 "")
         (command "line" p_1 p_2 "")
        )
      (if (> (cc p_1 p_3 p_2) 0)
         (progn
            (command "circle" "3p" p_1 p_2 p_3 "")
            (command "line" p_1 p_2 p_3 p_1 "")
          )
         (progn
            (setq p_2 (car (tmax p_1 p_3 (vl-remove p_1 (vl-remove p_3 plst)))))
            (command "circle" "3p" p_1 p_2 p_3 "")
            (command "line" p_1 p_2 p_3 p_1 "")
          )
      )
  )
)

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

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-12-23 18:15:56 | 显示全部楼层
能讲讲算法吗?

点评

1、先求第一点p1,p1为到点集包围矩形对角线交点最远的点,此时包围圆过p1且以对角线交点为圆心; 2、缩小包围圆,圆心向p1移动,圆半径缩小,直至第二点p2在圆上; 3、以P1、P2为弦,剩余点中对p1、p2构成的张角最  详情 回复 发表于 2014-12-23 20:01
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1883个

财富等级: 堆金积玉

 楼主| 发表于 2014-12-23 20:01:20 | 显示全部楼层
newer 发表于 2014-12-23 18:15
能讲讲算法吗?

1、先求第一点p1,p1为到点集包围矩形对角线交点最远的点,此时包围圆过p1且以对角线交点为圆心;
2、缩小包围圆,圆心向p1移动,圆半径缩小,直至第二点p2在圆上;
3、以P1、P2为弦,剩余点中对p1、p2构成的张角最小的点为p3(若最小张角为钝角,则p1p2为直径);
4、检验角p1p2p3是否为锐角,若是则最小包围圆过p1p2p3;否则以p1p3为弦,返回步骤3;

点评

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-12-23 20:25:10 | 显示全部楼层
aimisiyou 发表于 2014-12-23 20:01
1、先求第一点p1,p1为到点集包围矩形对角线交点最远的点,此时包围圆过p1且以对角线交点为圆心;
2、缩 ...

算法的时间复杂度是多少? N2 ?

点评

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

使用道具 举报

已领礼包: 1883个

财富等级: 堆金积玉

 楼主| 发表于 2014-12-23 20:31:09 | 显示全部楼层
newer 发表于 2014-12-23 20:25
算法的时间复杂度是多少? N2 ?

理论上是O(N)。

点评

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2014-12-23 20:42:01 | 显示全部楼层
aimisiyou 发表于 2014-12-23 20:31
理论上是O(N)。

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

使用道具 举报

已领礼包: 1883个

财富等级: 堆金积玉

 楼主| 发表于 2014-12-23 20:53:50 | 显示全部楼层
本帖最后由 aimisiyou 于 2016-10-16 08:37 编辑

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

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-12-23 21:48:32 来自手机 | 显示全部楼层
凸包、最小包围圆,高飞版主都写了,我认为是alisp的最佳算法了,看懂就够了,没必要自己再费时间

点评

呵呵,你可能觉得是浪费时间,但我认为照部就搬就没提高自己的思维水平,哪怕一些简单问题,自己换个角度思考下还是有点意义,个人看法。  详情 回复 发表于 2014-12-23 21:54
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1883个

财富等级: 堆金积玉

 楼主| 发表于 2014-12-23 21:54:18 | 显示全部楼层
csharp 发表于 2014-12-23 21:48
凸包、最小包围圆,高飞版主都写了,我认为是alisp的最佳算法了,看懂就够了,没必要自己再费时间

呵呵,你可能觉得是浪费时间,但我认为照部就搬就没提高自己的思维水平,哪怕一些简单问题,自己换个角度思考下还是有点意义,个人看法。

点评

看多了就能分出算法优劣,能区分自然就有提高,做事站在巨人肩上才能眼界更广、提高更快!  详情 回复 发表于 2014-12-23 21:59
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-12-23 21:59:27 来自手机 | 显示全部楼层
aimisiyou 发表于 2014-12-23 21:54
呵呵,你可能觉得是浪费时间,但我认为照部就搬就没提高自己的思维水平,哪怕一些简单问题,自己换个角度 ...

看多了就能分出算法优劣,能区分自然就有提高,做事站在巨人肩上才能眼界更广、提高更快!

点评

我只是跟着兴趣走,纯属自娱自乐而已,没想那么多。  详情 回复 发表于 2014-12-24 12:10
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

已领礼包: 1883个

财富等级: 堆金积玉

 楼主| 发表于 2014-12-24 12:10:49 | 显示全部楼层
csharp 发表于 2014-12-23 21:59
看多了就能分出算法优劣,能区分自然就有提高,做事站在巨人肩上才能眼界更广、提高更快!

我只是跟着兴趣走,纯属自娱自乐而已,没想那么多。

点评

高飞版主的算法,前三点构造最小圆,依次插入第四点,如果在圆在求该四点的最小圆,点集小于3点单独判断,每个点只遍历一次  详情 回复 发表于 2014-12-24 22:11
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-12-24 22:11:35 来自手机 | 显示全部楼层
aimisiyou 发表于 2014-12-24 12:10
我只是跟着兴趣走,纯属自娱自乐而已,没想那么多。

高飞版主的算法,前三点构造最小圆,依次插入第四点,如果在圆在求该四点的最小圆,点集小于3点单独判断,每个点只遍历一次

点评

你所说的“依次插入第四点”有点不准确,第四点应该是到前三点确定的最小覆盖圆圆心最远的点,最后“每个点只遍历一遍”就不正确了,迭代的条件是到已确定的圆心最远的点是否在圆内,那么迭代几次,每个点就遍历几次  详情 回复 发表于 2014-12-25 17:44
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1883个

财富等级: 堆金积玉

 楼主| 发表于 2014-12-25 12:30:45 来自手机 | 显示全部楼层
看来巨人的肩膀被你踩坏了,呵呵开个玩笑不介意吧。按你的说法,我认为你没有完全领悟透高飞的算法。该算法的精髓是通过三点迭代法(直径特殊情况不谈)不断扩大圆,最终满足圆覆盖所有点。

点评

恭喜你啊,比我理解透彻,有空了写成Net代码,前面按高飞版主lisp高效凸包算法改成了Net代码  详情 回复 发表于 2014-12-25 17:47
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1883个

财富等级: 堆金积玉

 楼主| 发表于 2014-12-25 17:44:36 | 显示全部楼层
csharp 发表于 2014-12-24 22:11
高飞版主的算法,前三点构造最小圆,依次插入第四点,如果在圆在求该四点的最小圆,点集小于3点单独判断 ...

你所说的“依次插入第四点”有点不准确,第四点应该是到前三点确定的最小覆盖圆圆心最远的点,最后“每个点只遍历一遍”就不正确了,迭代的条件是到已确定的圆心最远的点是否在圆内,那么迭代几次,每个点就遍历几次。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 11:34 , Processed in 0.508161 second(s), 69 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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