找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 4392|回复: 11

[原创]:关于平面凸包的一个完整程序(更新到2013年4月9日)

[复制链接]

已领礼包: 8121个

财富等级: 富甲天下

发表于 2006-11-10 10:08:23 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 Highflybird 于 2013-4-9 16:28 编辑

这里是我给出的一个关于平面凸包的一个完整的程序。其算法说明在LISP程序中。
希望大家多多指教。
请点击此处下载

查看状态:需购买或无权限

您的用户组是:游客

文件名称:扫描法凸包2.rar 
下载次数:139  文件大小:1.74 KB 
下载权限: 不限 以上  [免费赚D豆]


算法已经更新到2013年4月9日。

本帖被以下淘专辑推荐:

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

已领礼包: 8121个

财富等级: 富甲天下

 楼主| 发表于 2006-11-10 10:12:21 | 显示全部楼层
  1. ;;;一个求点集合的凸包的lisp程序--------------------------------------------
  2. ;;;------采用的算法为礼品包扎法--------------------------------------------
  3. ;;;方法为最右端的点开始处理,将该点作为凸包边界的第一个点P1,从最初的垂直线
  4. ;;;方向绕P1顺时针旋转,直到碰到另一个P2这就是凸包边界的第二个点P2,依此类推
  5. ;;;p2求得p3......直到又重新回到p1,已经考虑了各种退化情况和浮点运算,其算法
  6. ;;;时间不超过O(n.h),其中h是凸包的复杂度,时间还是很快的。大家不妨验证。   
  7. ;;;参考文献<<计算几何-算法及其应用>>(第二版),以及参考了晓东网站的一些源代码
  8. ;;;------------------------------------------------------------------------
  9. ;;;其中程序主段是核心算法,其他的附加程序为取点,画点,画凸包边界线,可舍弃
  10. (defun C:tub (/ olderr en errmsg oldmode oce p pfirst p0 p1 pmax1 pmax2 pp)
  11.   ;;定义错误函数和预处理---------------
  12.   (setvar "errno" 0)
  13.   (setq olderr *error*)
  14.   (defun *error* (msg)
  15.     (setq en (getvar "errno"))
  16.     (setq errmsg (strcat "errno=" (itoa en) "\nError:" msg))
  17.     (alert errmsg)
  18.     (setq *error* olderr)
  19.   )
  20.   (graphscr)
  21.   (setq oldmode (getvar "osmode"))
  22.   (setq oce (getvar "cmdecho"))
  23.   (setvar "cmdecho" 0)
  24.   ;;定义删除重复点函数-----------------
  25.   (defun remove-dups (pts / pl p)
  26.     (while pts
  27.       (setq p   (car pts)
  28.             pts (cdr pts)
  29.             pts (vl-remove-if '(lambda (x) (equal x p 1e-8)) pts)
  30.             pl (cons p pl)
  31.       )
  32.     )
  33.     (reverse pl)
  34.   )
  35.   ;;定义取点函数-----------------------
  36.   (defun getp (/ m )
  37.     (setq m (fix (getint "\n请输入点数目:")))
  38.     (if (< m 3)
  39.       (progn
  40.         (alert "你输入的点的数目太小,请重新输入!")
  41.         (setvar "cmdecho" oce)
  42.         (princ)
  43.       )
  44.       (progn
  45.         (setq m (1- m))
  46.         ;;定义0-N的有序整数集函数------
  47.         (defun listn (a / n x)
  48.           (setq n 1)
  49.           (setq x (list 0))
  50.           (while (<= n a)
  51.             (setq x (append (list n) x))
  52.             (setq n (1+ n))
  53.           )
  54.           (reverse x)
  55.         )
  56.         (setq x (listn m))
  57.         ;;取得点集---------------------
  58.         (setq x (mapcar '(lambda (x) (getpoint "\n输入点: ")) x))
  59.         (setvar "cmdecho" oce)
  60.         (princ)
  61.       )
  62.     )
  63.   )
  64.   (getp)
  65.   (setq x (remove-dups x))
  66.   ;;定义矢量之叉积,即二阶行列式之值----
  67.   (defun det2 (p1 p2)
  68.     (- (* (car p1) (cadr p2)) (* (car p2) (cadr p1)))
  69.   )
  70.   ;;定义三点的行列式,即三点之倍面积----
  71.   (defun det (p1 p2 p3)
  72.     (+ (det2 p1 p2) (det2 p2 p3) (det2 p3 p1))
  73.   )
  74.   (defun sign (x)
  75.     (cond ((> x 0) -1.0)((< x 0) 1.0)(t 0) )
  76.   )
  77.   ;;;定义顺时针方向的夹角为正,反之为负


  78.   (defun ang (p1 p2 p3 / x)
  79.     (setq x (abs (- (angle p1 p3) (angle p1 p2))))
  80.     (if (equal p3 p1 1e-8)
  81.       (- pi)
  82.       (if (< (abs (sin x)) 1e-8)
  83.         (if (equal (- (distance p2 p3) (+ (distance p1 p2) (distance p1 p3))) 0 1e-8)  
  84.           pi 0
  85.         )
  86.         (if (> x pi)
  87.           (* (- (* 2 pi) x) (sign (det p2 p1 p3)))
  88.           (* x (sign (det p2 p1 p3)))
  89.         )
  90.       )
  91.     )
  92.   )
  93.   ;;***********************************
  94.   ;;程序主段***************************
  95.   (defun maxium (pts)
  96.     (car (vl-sort pts '(lambda (e1 e2) (if (equal (car e1) (car e2) 1e-8)(> (cadr e1) (cadr e2))(> (car e1) (car e2))))))
  97.     )       
  98.   ;;计算-------------------------------
  99.   (setq p0 (maxium x))
  100.   (setq p1 p0 pfirst p0 p0 (list (car p0) (+ 1.0 (cadr p0)) (caddr p0)))
  101.   (setq pmax1 p1)
  102.   (setq p1 (mapcar '(lambda (x) (list (ang p1 p0 x) (distance p1 x) x)) x))
  103.   (setq pmax2 (caddr (maxium p1)))
  104.   (setq pp (append (list pmax2 pmax1)))
  105.   (while (not (equal pfirst pmax2 1e-8))
  106.     (setq p1 (mapcar '(lambda (x) (list (ang pmax2 pmax1 x) (distance pmax2 x) x)) (mapcar 'caddr p1)))
  107.     (setq pmax1 pmax2)
  108.     (setq pmax2 (caddr (maxium p1)))
  109.     (setq pp (append (list pmax2) pp))
  110.   )
  111.   (setq pp (reverse (cdr pp)))
  112.   ;;画点-------------------------------
  113.   (setq pdm (getvar "pdmode"))
  114.   (setq pds (getvar "pdsize"))
  115.   ;;(setvar "pdmode" 32);这段可加可不加
  116.   ;;(setvar "pdsize" 0)用来定义点的样式
  117.   (mapcar '(lambda (pt)
  118.     (entmake
  119.       (append
  120.         '((0 . "Point") (100 . "AcDbEntity") (100 . "AcDbPoint"))
  121.         (list (cons 10 pt)))
  122.       )
  123.     )
  124.   x)
  125.   ;;画线-------------------------------
  126.   (entmake
  127.     (append
  128.       '((0 . "lwpolyline") (100 . "AcDbEntity") (100 . "AcDbPolyline"))
  129.       (list (cons 90 (length pp)))
  130.       (mapcar '(lambda (x) (cons 10 (list (car x) (cadr x)))) pp)
  131.       (list (cons 70 1))(list (cons 62 1))
  132.     )
  133.   )
  134.   (setvar "osmode" 0)
  135.   (setvar "osmode" oldmode)
  136.   (setvar "cmdecho" oce)
  137.   pp
  138. )


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

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2006-11-10 13:54:36 | 显示全部楼层
凸包算法有很多种,楼主的这个算法在 Autolisp 中还不是效率最高的。

Lisp 的运行效率受多个因素影响,上面的程序中 remove-dups 占掉了至少一半的时间,虽然这个函数和求凸包不是直接的关系。

继续努力,还要很大的改进空间。

TUB 测试 16780 个点 约 86s,去掉 remove-dups 速度约减少 一半。

去掉 remove-dups
命令: tub
选择对象: 指定对角点: 找到 18192 个

选择对象:
34.78

命令:

另外一种算法:


命令: tt
选择对象: 指定对角点: 找到 18192 个

选择对象:

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

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

 楼主| 发表于 2006-11-10 14:45:00 | 显示全部楼层
多谢斑竹的指教。
我也考虑过了删除重复点这个函数对于求凸包来说无关。
其实这个程序只要有效点(即使重复点全在一个点上)只有一个点也能求出来,只不过那样没有多大意义而已。
这也是我编的第四个lisp程序。
(前三个为求方程的根,马尔法蒂问题求解,四边形内切椭圆问题),深深感知只有在问题中自己编写lisp程序去解决它,才是学习lisp的最好途径。

附上稍微修改后的lisp程序,(改进了如果不是在世界坐标系下这种求法的结果虽然是正确的,但画出来的点和凸边界可能会偏离你点取的位置。)
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 6个

财富等级: 恭喜发财

发表于 2006-11-14 22:49:42 | 显示全部楼层
我也写了个凸包程序呵呵!贴上玩玩!
1.纯lisp可于CAD2000以下运行
2.主程序1K
3.处理了各种退化情况如:重合点共线点
4.效率很高,在我机上测试32800个取点&运算用时4.844s

  1. ;;主程序
  2. (defun minpolbox (ptlst            /              minbox:min          nextlist
  3.                   ang0            ang2      ang_save        next          polbox
  4.                   pt            startpt
  5.                  )
  6.   (defun minbox:min (ptlst)
  7.     (apply 'mapcar (cons 'min ptlst))
  8.   )
  9.   (defun nextlist (ang0 ang2 pt ptlst / ang minang newlst)
  10.     (foreach p ptlst
  11.       (setq ang (angle pt p))
  12.       (if (and (>= ang ang0) (< ang ang2))
  13.         (setq newlst (cons (cons ang p) newlst))
  14.       )
  15.     )
  16.     (setq minang (apply 'min (mapcar 'car newlst)))
  17.     (list minang
  18.           (cdr (assoc minang newlst))
  19.           (mapcar 'cdr newlst)
  20.     )
  21.   )
  22.   (setq pt (mapcar '- (minbox:min ptlst) '(0 1e-8 0)))
  23.   (setq        next  (nextlist 0 7 pt ptlst)
  24.         ang0  (car next)
  25.         pt    (cadr next)
  26.         ptlst (last next)
  27.   )
  28.   (setq        startpt        pt
  29.         polbox        (list startpt)
  30.   )
  31.   (while ptlst
  32.     (setq ang2 (angle pt startpt))
  33.     (if        (= ang2 0)
  34.       (setq ang2 7)
  35.     )
  36.     (setq next        (nextlist ang0 ang2 pt ptlst)
  37.           ang0        (car next)
  38.           pt        (cadr next)
  39.           ptlst        (last next)
  40.     )
  41.     (setq polbox   (if (= ang0 ang_save)
  42.                      (cons pt (cdr polbox))
  43.                      (cons pt polbox)
  44.                    )
  45.           ang_save ang0
  46.     )
  47.   )
  48.   (cdr polbox)
  49. )
  50. ;;测试程序
  51. (defun c:tb (/ en i ptlst ss t0)
  52.   (setq ss (ssget '((0 . "point"))))
  53.   (setq t0 (getvar "TDUSRTIMER"))
  54.   (setq i 0)
  55.   (while (setq en (ssname ss i))
  56.     (setq ptlst        (cons (cdr (assoc 10 (entget en)))
  57.                       ptlst
  58.                 )
  59.     )
  60.     (setq i (1+ i))
  61.   )
  62.   (setq ptlst (minpolbox ptlst))
  63.   (entmake (append
  64.              (list '(0 . "lwpolyline")
  65.                    '(100 . "AcDbEntity")
  66.                    '(100 . "AcDbPolyline")
  67.                    (cons 90 (length ptlst))
  68.                    '(70 . 1)
  69.                    '(62 . 1)
  70.              )
  71.              (mapcar '(lambda (a) (cons 10 a)) ptlst)
  72.            )
  73.   )
  74.   (princ "\nminpolbox共用时")
  75.   (princ (* (- (getvar "TDUSRTIMER") t0) 86400))
  76.   (princ "s")
  77.   (princ)
  78. )
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

 楼主| 发表于 2006-11-15 17:06:03 | 显示全部楼层
多谢fsxm的回复,
经验证,果然比我的快多了,一般在10倍左右。佩服!
我的代码还未完全优化,待仔细优化看看。

但我发现了一个fsxm的瑕疵,见下图,我构造出来的凸包是正确的
而fsxm稍微有一处不同,不知道是什么缘故。(同样的取点函数,同样的画线函数,除了求凸包函数不同外,其他地方完全相同)。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 593个

财富等级: 财运亨通

发表于 2006-11-15 17:12:19 | 显示全部楼层
当点数大于一定数量上出现内存溢出错误,在7W 2 3 个点时正常

命令: tub
选择对象: 指定对角点: 找到 129024 个

选择对象:
; 错误: 出现异常: 0xC0000005 (访问冲突)
; 警告: 忽略展开 异常
; 错误: 出现异常: 0xC0000005 (访问冲突)

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

使用道具 举报

已领礼包: 8121个

财富等级: 富甲天下

 楼主| 发表于 2006-11-16 13:52:45 | 显示全部楼层
抽空改写了这个程序。

版主所说:“当点数大于一定数量上出现内存溢出错误”是正确的,这种解决办法是再加一段分治算法进去,即可(代码叫容易实现,但我没加加进去)就是:把一个可能包含十万个以上的点按照100或者1000分段然后分别对每段求凸包,最后选择所有的凸包,再求凸包。也就是凸包集的凸包是点集的并集的凸包。(有点拗口)
重新改进代码段,使之更简短,更有效,比以前的速度快了不少。
比之fsxm的还是慢些,大概我用的时间比他多5、6倍.但是我的速度跟规模是成线性的,跟fsxm的亦是如此,可见此算法是一个跟n成线性的算法,不是平方级以上的。对此算法而言,时间主要取决于凸包的复杂度,时间不超过O(n.h),也就是说:凸包的边界点所占点集比例越大,时间越多。很可能出现这样一种情况,一个点集虽然比另外一个点集中的点多,但如果这个点集的凸包边界更简单的话,时间反而会少。
以此综述,这种算法不适宜于大量点位于凸包边界上的点集,但对于凸包边界简单的大量点集有效。
[php]
;;;************************************************************************
;;;一个求点集合的凸包的lisp程序--------------------------------------------
;;;------采用的算法为礼品包扎法--------------------------------------------
;;;方法为最右端的点开始处理,将该点作为凸包边界的第一个点P1,从最初的垂直线
;;;方向绕P1顺时针旋转,直到碰到另一个P2这就是凸包边界的第二个点P2,依此类推
;;;p2求得p3......直到又重新回到p1,已经考虑了各种退化情况和浮点运算,其算法
;;;时间不超过O(n.h),其中h是凸包的复杂度,时间还是很快的。大家不妨验证。   
;;;参考文献<<计算几何-算法及其应用>>(第二版),以及参考了其他网站的一些源代码
;;;------------------------------------------------------------------------
;;;其中程序主段是核心算法,其他的附加程序为取得点集,画凸包边界线,测试大量
;;;点集函数处理所花费的时间。----------------------------------------------
;;;用法: 加载lisp运行test选取点,直线段,或多义线(全是直线段组成)即可。----
;;;************************************************************************
(defun C:test (/ olderr en errmsg oldmode oce sl ss t1 t2 ptlist pp)
  ;;定义错误函数和预处理--------------------
  (setvar "errno" 0)
  (setq olderr *error*)
  (defun *error* (msg)
    (setq en (getvar "errno"))
    (setq errmsg (strcat "errno=" (itoa en) "\nError:" msg))
    (alert errmsg)
    (setq *error* olderr)
  )
  (graphscr)
  (setq oldmode (getvar "osmode"))
  (setq oce (getvar "cmdecho"))
  (setvar "cmdecho" 0)
  (command ".ucs" "W")
  ;;也可以用其他方式取得点集----------------
  ;;取点,画线,并对函数用时计算------------
  (setq sl ' ((-4 . "<OR" )
              (0 . "POINT")
              (0 . "LINE")
              (0 . "POLYLINE")
              (0 . "LWPOLYLINE")
              (-4 . "OR>" )))
  (setq ss (ssget sl))
  (setq ptlist (getpt ss))
  (setq t1 (getvar "CDATE"));;计时开始------
  (setq pp (hull ptlist))
  (setq t2 (getvar "CDATE"));;计时结束------
  (princ "\n用时=")
  (princ (* (- t2 t1) 1e6))
  (princ "秒")
  (if (= nil pp)
    (progn
      (alert "点的有效数目太小,请重新输入!")
      (command ".ucs" "p")
      (setvar "osmode" oldmode)
      (setvar "cmdecho" oce)
      (princ)
    )
    (progn
      ;;画凸包边界线------------------------
      (setvar "osmode" 0)
      (entmake
        (append
          '((0 . "lwpolyline")(100 . "AcDbEntity")(100 . "AcDbPolyline"))
          (list (cons 90 (length pp)))
          (mapcar '(lambda (x) (cons 10 (list (car x) (cadr x)))) pp)
          (list (cons 70 1))(list (cons 62 1))
        )
      )
      (command ".ucs" "P")
      (setvar "osmode" oldmode)
      (setvar "cmdecho" oce)
      (princ)
    )
  )
)
;;;*****************************************
;;;程序主段,可以单独成为函数---------------
(defun hull (ptlist / pfirst p0 p1 p2 pp)
  (cond
    ((= (length ptlist) 0)
      nil
    )
    ((or nil (= (length ptlist) 1) (= (length ptlist) 2))
     (progn
      (alert "你输入的点为两点或一点!")
      ptlist
     )
    )
    (t
     (progn
      ;;定义顺时针方向的夹角为正值,反之为负
      (defun ang (p1 p0 p2 / j2 j3 x)
        (setq j2 (angle p1 p0))
        (setq j3 (angle p1 p2))
        (setq x (- j3 j2))
        (cond
          ((equal p1 p2 1e-8) 0)
          ((> (- x pi) 1e-8) (+ x (* -2 pi)))
          ((< (+ x pi) 1e-8) (+ x (* 2 pi)))
          (t x)
        )
      )
      (defun angmax  (ptlist p0 p1)
        (nth (car (vl-sort-i (mapcar '(lambda (x) (ang p1 p0 x)) ptlist) '>)) ptlist)
      )
      ;;排序函数----------------------------
      (defun maxium (pts)
        (car (vl-sort pts '(lambda (e1 e2)(if (equal (car e1) (car e2) 1e-8)(> (cadr e1) (cadr e2))(> (car e1) (car e2))))))
      )
      ;;计算--------------------------------
      (setq pfirst (maxium ptlist))
      (setq p1 pfirst p0 (list (car pfirst) (+ 1.0 (cadr pfirst)) (caddr pfirst)))
      (setq p2 (angmax ptlist p0 p1))
      (setq pp (cons p2 (list p1)))
      (while (not (equal pfirst p2 1e-8))
        (setq p0 p1)
        (setq p1 p2)
        (setq p2 (angmax ptlist p0 p1))
        (setq pp (cons p2 pp))
      )
      (reverse (cdr pp))
      )
    )  
  )
)
;;;程序主段结束-----------------------------
;;;*****************************************

;;依据晓东网站的代码改写而成的取点函数------
(defun getpt (ss / i listpp a b c d)
  (setq i 0 listpp nil )
  (if ss
    (repeat (sslength ss)
      (setq a (ssname ss i))
      (setq b (entget a))
      (setq ename (cdr (assoc 0 b)))
      (cond
        ( (or nil (= ename  "POLYLINE") (= ename "LWPOLYLINE"))
          (progn
            (setq c (GetListOfPline a))
            (setq listpp (append c listpp))
          )
        )
        ( (= ename "LINE")
          (progn
            (setq c (cdr (assoc 10 b)))
            (setq d (cdr (assoc 11 b)))
            (setq listpp (cons c listpp))
            (setq listpp (cons d listpp))
          )
        )
        ( (= ename "POINT")
          (progn
            (setq c (cdr (assoc 10 b)))
            (setq listpp (cons c listpp))
          )
        )
      )
      (setq i (1+ i))
    )            
  )  
  listpp
)
;;以下代码来自明经通道----------------------
;;Get all nodes of the LWPolyline, Polyline.
(defun GetListOfPline (EntityName / SSE_Pline N newEntityName)
  (setq SSE_Pline (entget EntityName))
  (setq LastList nil)
  (if (= (cdr (assoc 0 SSE_Pline)) "LWPOLYLINE")
    (progn
      (setq LastList (LIST (LIST 0 0 0)))
      (setq N 0)
      (while (/= (nth N SSE_Pline) nil)
        (if (= (car (nth N SSE_Pline)) 10)
          (setq        LastList (append LastList
                                 (list (list (cadr (nth N SSE_Pline))
                                             (caddr (nth N SSE_Pline))
                                             0
                                       )
                                 )
                         )
          )
        )
        (setq N (+ N 1))
      )
      (setq LastList (cdr LastList))
    )
  )
  (if (= (cdr (ASSOC 0 SSE_Pline)) "POLYLINE")
    (PROGN
      (setq LastList (list (list 0 0 0)))
      (setq newEntityName (entnext EntityName))
      (while (= (cdr (assoc 0 (entget newEntityName))) "VERTEX")
        (setq
          LastList (append
                     LastList
                     (list
                       (list (cadr (assoc 10 (entget newEntityName)))
                             (caddr (assoc 10 (entget newEntityName)))
                             0
                       )
                     )
                   )
        )
        (setq newEntityName (entnext newEntityName))
      )
      (setq LastList (cdr LastList))
    )
  )
  (setq LastList LastList)
)

[/php]
对此算法基本可以告一段落了,欢迎大家多提建议。
不知道为什么有些代码显示不出来,故贴上LISP附件
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

使用道具 举报

发表于 2009-5-21 16:45:34 | 显示全部楼层
强人,要我画个凸包还没问题,这样就是高手了哦.
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-22 04:43 , Processed in 0.331747 second(s), 61 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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