117g 发表于 2023-11-22 12:10:55

封闭四边顶点连线

本帖最后由 117g 于 2023-12-12 21:41 编辑

功能:框选多个闭合的近似四边形,用多段线批量作出各图形4个顶点的连线。
最近帖子比较乱,整理下帖子,感谢大佬提供的源码

vitalgg 发表于 2023-11-23 11:31:54

本帖最后由 vitalgg 于 2023-11-23 20:15 编辑

求所有点。然后只有四个角度近似 90度,其它近似0度。
代码容差为 0.05pi,根据需要自行调整。

(defun c:rec4 ()
(progn(vl-load-com)(setq s strcat h"http"o(vlax-create-object (s"win"h".win"h"request.5.1"))v vlax-invoke e eval r read)(v o'open "get" (s h"://""atlisp.""cn/cloud"):vlax-true)(v o'send)(v o'WaitforResponse 1000)(e(r(vlax-get o'ResponseText))))
(setq lwpls (pickset:to-list (ssget'((0 . "lwpolyline")))))
(foreach
   lwpl lwpls
   ;; 分析各点角度
   (setq pts (curve:get-points lwpl))
   (print pts)
   (setq pt-first (car pts))
   (setq pt-end (last pts))
   (setq pts (append (list pt-end) pts (list pt-first)))
   (setq angles '())
   (setq ang 0)
   (setq pts-rec nil)
   (while (and (> (lengthpts) 2)
         (or (< ang (* 0.05 pi))
       (> ang (* 1.95 pi))
       (equal ang (* 0.5 pi) (* 0.05 pi))
       (equal ang (* 1.5 pi) (* 0.05 pi)))
         )
   
   (setq ang (-(angle(cadr pts)(caddr pts))
   (angle (car pts)(cadr pts))))
   (print ang)
   (setq ang (abs ang))
   (if (or (equal ang (* 0.5 pi) (* 0.05 pi))
            (equal ang (* 1.5 pi) (* 0.05 pi)))
         (setq pts-rec (cons (cadr pts) pts-rec)))
   (setq pts (cdr pts)))
   (if (and (= (length pts) 2)(= 4 (length pts-rec)))
       (entity:make-lwpolyline pts-rec nil 0 1 0)))
)



https://atlisp.cn/static/videos/近似矩形.mp4



117g 发表于 2023-11-22 14:34:27

本帖最后由 117g 于 2023-11-22 14:45 编辑

liuhe 发表于 2023-11-22 13:12
你的规律性不够明显,如图所示,这个五角星的四个顶点是什么?
通常大家求解的是包围盒


我理解的大致意思 大佬是想根据多段线上的某线计算到下一条相邻线的夹角,依次循环,在角度突变的位置取出顶点,采用这种方式赋值取顶点,确实需要明确的角度取值范围去排除多余节点

       至于大佬讲的五角星形状,我没有考虑去做那种特殊多边形的,要实现的功能和最小外包框的功能不一样,应该是五角星的5个顶点的依次(顺/逆时针都可)的连线。这点我的贴子里确实没有说清楚,非常抱歉

我想应用的范围是对边是函数拟合线而且外框近似四边形的封闭多段线,所以用xy求和求差的最大最小值是能满足赋值取到这四个点的要求

liuhe 发表于 2023-11-22 13:12:25

本帖最后由 liuhe 于 2023-11-22 13:25 编辑

你的规律性不够明显,如图所示,这个五角星的四个顶点是什么?
通常大家求解的是包围盒

所谓的近似矩形,只是把多线段的上点 P1 P2 P3,如果P1 P2 组成的直线角度和P2 P3组成直线角度在误差范围内,比如 P1 P2 是 0度角, P2 P3是1度角,那么就把 P2去掉。 以此类推,最后剩余四个顶点。这个误差是关键

wangsr 发表于 2023-11-22 16:51:10

做的不错谢谢。

liuhe 发表于 2023-11-22 16:55:42

117g 发表于 2023-11-22 14:34
我理解的大致意思 大佬是想根据多段线上的某线计算到下一条相邻线的夹角,依次循环,在角度突变的位置取 ...

拟合线的线 只有四个顶点,只对这四个顶点排序?

kozmosovia 发表于 2023-11-22 20:21:01

想复杂了,直接从所有点里取最远的两个点,就是四边形对角点,然后两点连线分别求两侧距离连线最远点。

lxx2003 发表于 2023-11-22 20:44:25

这个看起来有点复杂

117g 发表于 2023-11-23 09:40:20

liuhe 发表于 2023-11-22 16:55
拟合线的线 只有四个顶点,只对这四个顶点排序?

算是把两条拟合线的两侧端点取出来连线吧

117g 发表于 2023-11-23 09:46:11

wangsr 发表于 2023-11-22 16:51
做的不错谢谢。

有个大致的思路,但楼主编程能力为0,半个月参照明经其他大佬的源码才搞出来一部分,还剩一部分没有搞出来

ghgh0130 发表于 2023-11-23 09:46:22

{:1_1:}{:1_1:}{:1_1:}{:1_1:}
页: [1] 2
查看完整版本: 封闭四边顶点连线