邹锋 发表于 2014-5-11 13:57:39

研究过最大包围框的,请进

如图,


任意框选品红色线两个对角点,得到里面三个选择集的最大包围框,是得到三个包围框哦,
有什么方法或者思路吗

念悬工具箱 发表于 2021-4-18 18:33:07

;;;感谢lostbalance与作者,原帖: http://bbs.mjtd.com/thread-178146-1-1.html
(defun intersect (a b)
      (if
            (or
                (and ;;b左下角在a框内
                  (<= (caar a) (caar b) (caadr a))
                  (<= (cadar a) (cadar b) (cadadr a))
                )
                (and ;;b左上角在a框内
                  (<= (caar a) (caar b) (caadr a))
                  (<= (cadar a) (cadadr b) (cadadr a))
                )
                (and ;;b右上角在a框内
                  (<= (caar a) (caadr b) (caadr a))
                  (<= (cadar a) (cadadr b) (cadadr a))
                )
                (and ;;b右下角在a框内
                  (<= (caar a) (caadr b) (caadr a))
                  (<= (cadar a) (cadar b) (cadadr a))
                )
                (and ;;a框部分包含在b框内
                  (<= (caar a) (caar b) (caadr a)) ;;xa1<=xb1<=xa2
                  (>= (cadar a) (cadar b)) ;;ya1>=yb1
                  (<= (cadadr a) (cadadr b)) ;;ya2<=yb2
                )
            )
            (list
                (apply 'mapcar (cons 'min (append a b)))
                (apply 'mapcar (cons 'max (append a b)))
            )
      )
    )

邹锋 发表于 2014-8-20 00:48:21

本帖最后由 邹锋 于 2014-8-25 22:01 编辑

Jack_PC 发表于 2014-8-19 22:39 static/image/common/back.gif
都这么久的贴了,希望知道的出来说说程序的原理

求出每 一个实体的最小包围框的角点,然后每个点与点表循环判断是不是在别的对角点表内,


BOX是求一个实体的最小包围框函数,对SPLINE很有用
intersect 函数是判断每两个包围框的角点,判断第一个A的两个角点是在那个包围框内还是外,如果在外,则不返回,如果要交就返回这两个中的最小点与最大点



rectang 函数是生成一个最小框,

它如果是这样的图形,会出现错误的话,我再加一组判断就行了




(defun intersect (a b)
    (if
      (or
        (and
          (<= (caar a) (caar b) (caadr a))
          (<= (cadar a) (cadar b) (cadadr a))
        ) ;_ 结束and
        (and
          (<= (caar a) (caar b) (caadr a))
          (<= (cadar a) (cadadr b) (cadadr a))
        ) ;_ 结束and
        (and
          (<= (caar a) (caadr b) (caadr a))
          (<= (cadar a) (cadadr b) (cadadr a))
        ) ;_ 结束and
        (and
          (<= (caar a) (caadr b) (caadr a))
          (<= (cadar a) (cadar b) (cadadr a))
        ) ;_ 结束and
       
        (and
          (<= (caar a) (caar b))
          (>= (caadr a) (caar b))
          (<= (caadr a) (cadadr b))
          (>= (cadar a) (cadar b))
          (<= (cadadr a) (cadadr b))          
        ) ;_ 结束and

      ) ;_ 结束or
       (list
       (apply 'mapcar (cons 'min (append a b)))
       (apply 'mapcar (cons 'max (append a b)))
       ) ;_ 结束list
    ) ;_ 结束if
) ;_ 结束defun

xyp1964 发表于 2014-5-11 14:09:42

;; 先建图块后处理

邹锋 发表于 2014-5-11 14:24:59

xyp1964 发表于 2014-5-11 14:09 static/image/common/back.gif
;; 先建图块后处理

我就是不知道怎么得到三个选择集,有选择集后就好办了

Andyhon 发表于 2014-5-11 14:27:57

想先知道您的XY图标基点可用来作为分割的参考吗?

byghbcx 发表于 2014-5-11 14:34:54

人为先作块吧

Q1241274614 发表于 2014-5-11 14:56:44

选择集a,第一个图元外框ssget(外框四点点集)循环,循环前循环后图元数相同形成一个集,重新开始一个图元外框……,直到集长度为 0

434939575 发表于 2014-5-11 15:16:17

有个思路。就是把所有的图元全部建立一个一个: 包围框==接着把所有的全部焊接=最后就得出这三个最大包容盒子了。准备写这个。还没开始。希望楼主能分享,谢谢。

434939575 发表于 2014-5-11 15:19:22

只是图元不要碰到一起了。

434939575 发表于 2014-5-11 17:15:57

434939575 发表于 2014-5-11 15:16 static/image/common/back.gif
有个思路。就是把所有的图元全部建立一个一个: 包围框==接着把所有的全部焊接=最后就得出这三个最大包容盒子 ...

我j讲的焊接:先变;REGION>UNION

lostbalance 发表于 2014-5-11 18:48:57

这个跟批量打印遇到的问题差不多啊
页: [1] 2 3 4 5 6
查看完整版本: 研究过最大包围框的,请进