找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1093|回复: 4

[研讨] 求凹多边形(多线段)的凸包

[复制链接]

已领礼包: 1861个

财富等级: 堆金积玉

发表于 2016-10-15 08:50:03 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 aimisiyou 于 2016-10-15 09:10 编辑

;;;向量叉乘
(defun sfun (pt1 pt2 pt3)
       (setq va (-
                   (* (- (car pt2) (car pt1)) (- (cadr pt3) (cadr pt2)) )
                   (* (- (car pt3) (car pt2)) (- (cadr pt2) (cadr pt1)) )
                 )
         )
)
(defun fxfun (pts)
    ;;;获取横坐标最小的点在顶点集中的位置
   (setq n0 (car (vl-sort-i pts
                           (function (lambda (e1 e2)
                                             (< (car e1) (car e2))
                                      )
                            )
                  )
             )
     )
    (setq xmin (car (nth n0 pts)))
    (setq xmins (vl-remove nil (mapcar '(lambda (x) (if (= xmin (car x)) x ))  pts)))
    ;;;判断闭合多线段方向
    (if (= (length xmins) 1)
        (setq flag (cond
               ((= n0 0) (sfun (last pts) (car pts) (cadr pts )))
               ((= n0 (- (length pts) 1)) (sfun (car (cdr (reverse pts))) (last pts)  (car pts )) )
               (t (sfun (nth (- n0 1) pts) (nth n0 pts) (nth (+ n0 1) pts)))
            )
         )
        (if (< (cadr (car xmins)) (cadr (cadr xmins)))  (setq flag -1) (setq flag 1))
     )
    (if (< flag 0) (setq vs -1)(setq vs 1))
    vs
)
(defun hfun (pts)
   (if (>= (sfun (last pts) (car pts) (cadr pts )) 0)  (setq v1 1) (setq v1 -1) )
   (if (>= (sfun (car (cdr (reverse pts))) (last pts)  (car pts )) 0)  (setq vn 1)(setq vn -1))
   (setq vllst (mapcar '(lambda (x y z)
                              (if (< (sfun x y z) 0) -1 1)
                       )
                       pts
                      (cdr pts)
                      (cdr (cdr pts))
               )
    )   
   (setq vlst (append (list v1) vllst (list vn)))
    vlst
)
(setq pts (mapcar 'cdr (vl-remove-if-not '(lambda (x) (= (car x) 10)) (entget (car (entsel))))))
(setq fn (fxfun pts))
(while (/= (length pts) (* fn (apply '+ (hfun pts))))
      (setq pts (vl-remove nil (mapcar '(lambda (x y) (if (= (* fn x) 1) y))  (hfun pts) pts)))
)
(apply 'command (cons "pline" (reverse (cons "c" (reverse pts)))))

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

已领礼包: 19个

财富等级: 恭喜发财

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

使用道具 举报

已领礼包: 1861个

财富等级: 堆金积玉

 楼主| 发表于 2016-10-15 17:01:36 | 显示全部楼层
本帖最后由 aimisiyou 于 2016-10-15 17:08 编辑

重装浏览器,终于可以上传图片了。
凹多边形如果只通过顶点连线进行凸分,往往没有借助辅助点的凸分效果好(一是分割凸多边形数目少,而是分割的凸多边形形态较好)。
捕获.PNG
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 5583个

财富等级: 富甲天下

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

使用道具 举报

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 12:37 , Processed in 0.267892 second(s), 39 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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