找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

楼主: aimisiyou

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

[复制链接]

已领礼包: 859个

财富等级: 财运亨通

发表于 2014-12-25 17:47:33 来自手机 | 显示全部楼层
aimisiyou 发表于 2014-12-25 12:30
看来巨人的肩膀被你踩坏了,呵呵开个玩笑不介意吧。按你的说法,我认为你没有完全领悟透高飞的算法。该算法 ...

恭喜你啊,比我理解透彻,有空了写成Net代码,前面按高飞版主lisp高效凸包算法改成了Net代码

点评

经典的程序都值得细细品味。对于一般情况,高飞算法迭代很少次数就能得到最小覆盖圆,所以执行速度很快。初步想了下特殊情况,比如点集分散在最小覆盖圆左右,估计迭代次数就多些,当然这特殊情况很少出现。  详情 回复 发表于 2014-12-25 18:07
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1883个

财富等级: 堆金积玉

 楼主| 发表于 2014-12-25 18:07:05 | 显示全部楼层
csharp 发表于 2014-12-25 17:47
恭喜你啊,比我理解透彻,有空了写成Net代码,前面按高飞版主lisp高效凸包算法改成了Net代码

经典的程序都值得细细品味。对于一般情况,高飞算法迭代很少次数就能得到最小覆盖圆,所以执行速度很快。初步想了下特殊情况,比如点集分散在最小覆盖圆左右,估计迭代次数就多些,当然这特殊情况很少出现。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1883个

财富等级: 堆金积玉

 楼主| 发表于 2014-12-26 02:27:10 来自手机 | 显示全部楼层
写完前面的平面点集的最小包围圆算法,总感觉还能做点什么,加上论友提到凸包算法,然后网上搜了部分相关凸包算法及高版的礼品包扎算法,突想能不能在原算法上实现呢?带着疑问入梦,总睡不踏实,半夜醒来突然有点思路,简要写下算法,1求最小包围圆上的三点(直径特例两点)。2以三点构成三角形,删除三角形内部的点 (特例情况下选个到直径端点张角最大的点构成三角形)。3求剩余点中每边的最大张角及该点,若张角大于90度将每边对应的张角点加入进来,更新凸包,并删除凸包内的点。4重复步骤3。   5每边都没有对应的张角点时结束迭代过程。      
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1883个

财富等级: 堆金积玉

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

使用道具 举报

已领礼包: 1883个

财富等级: 堆金积玉

 楼主| 发表于 2014-12-30 18:24:43 | 显示全部楼层
今天论友指出了我的算法中第一点P1在特殊情况下不在最小包围圆上(http://bbs.emath.ac.cn/forum.php ... amp;page=2#pid56898),即最终的三角形为钝角三角形时运算不正确。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

昕没函pl 该用户已被删除
发表于 2015-10-25 11:30:26 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1883个

财富等级: 堆金积玉

 楼主| 发表于 2015-10-30 00:03:26 | 显示全部楼层
本帖最后由 aimisiyou 于 2015-10-30 00:04 编辑

(defun gcen (plst)
  (setq nn (length plst))
  (setq p_g (list (/ (apply '+ (mapcar '(lambda (x)  (car x)) plst )) nn) (/ (apply '+ (mapcar '(lambda (x)  (cadr x)) plst )) nn)))
)
(defun p_dmax (p plst)
   (setq lst (vl-sort plst '(lambda(a b) (> (distance p a) (distance p b))) ))
)
(defun fmax (p_1 p_j p)
   (setq d1 (distance p_1 p_j) d2 (distance p_1 p) d3 (distance p_j p))
   (setq dn (/ (* d2 d2 d1) (+ (* d1 d1) (* d2 d2) (* d3 d3 -1))  ))
)
(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))) ))
)
(defun cc (p_1 p_2 p)
   (setq d1 (distance p_1 p) d2 (distance p_2 p) d3 (distance p_1 p_2))
   (setq cosa (/ (+ (* d1 d1) (* d2 d2) (* d3 d3 -1)) (* d1 d2 2) ))
)
(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) )) ))
)
(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:tt()
   (setq plst (fp))
   (setq p_j (gcen 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 "pline" p_1 p_2 "")
        )
      (if (> (cc p_1 p_3 p_2) 0)
         (progn
            (command "circle" "3p" p_1 p_2 p_3 "")
            (command "pline" 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 "pline" p_1 p_2 p_3 p_1 "")
          )
       )
    )
)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 1883个

财富等级: 堆金积玉

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

使用道具 举报

已领礼包: 40个

财富等级: 招财进宝

发表于 2016-11-4 00:41:52 | 显示全部楼层

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

使用道具 举报

已领礼包: 1883个

财富等级: 堆金积玉

 楼主| 发表于 2016-11-4 21:25:28 | 显示全部楼层
本帖最后由 aimisiyou 于 2016-11-4 21:27 编辑

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-22 11:35 , Processed in 0.422879 second(s), 44 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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