自贡黄明儒 发表于 2014-11-24 15:30:06

;;[功能] 判断多段线自交

;;[功能] 判断多段线自交
;;自贡黄明儒 2014.11.24(HH_LWPOLYLINEInters (car(entsel)))
(defun HH_LWPOLYLINEInters (e / E0 I P PTS)
(setq pts (Entity:Box e))
(setq p (mapcar '- (car pts) '(2 2)))
(setq pts (list p (cadr pts)))
(setq p (mapcar '+ (car pts) '(1 1)))
(setvar "nomutt" 1)
(setq e0 (entlast))
(APPLY 'Make-Rectange pts)
(APPLY 'command (list "BOUNDARY" p))
(while (not (equal (getvar "cmdnames") "")) (apply 'command (list "")))
(setvar "nomutt" 0)
(cond        ((entnext e0)
       (setq i 0)
       (while (setq e (entnext e0)) (setq i (1+ i)) (entdel e))
       (> i 1)
        )
)
)
;;[功能] 实体包围盒2角点
(defun Entity:Box (obj / bp up)
(cond ((equal (type obj) 'ENAME) (setq obj (vlax-ename->vla-object obj))))
(vla-getboundingbox obj 'bp 'up)
(list (safearray-value bp) (safearray-value up))
)

;;164.30 [功能] 构造矩形 by highflybird
(defun Make-Rectange (pt1 pt2)
(entmake
    (list
      '(0 . "LWPOLYLINE")                                  ;轻多段线
      '(100 . "AcDbEntity")
      '(100 . "AcDbPolyline")
      '(90 . 4)                                                  ;四个顶点
      '(70 . 1)                                                  ;闭合
      ;;(cons 38 (caddr pt1))                                  ;高程
      (cons 10 (list (car pt1) (cadr pt1)))                  ;左下角
      (cons 10 (list (car pt2) (cadr pt1)))                  ;右下角
      (cons 10 (list (car pt2) (cadr pt2)))                  ;右上角
      (cons 10 (list (car pt1) (cadr pt2)))                  ;左上角
      (cons 210 '(0 0 1))                                  ;法线方向
    )
)
)

caogis 发表于 2015-9-1 07:08:35

这个理论应用得也很独特

鱼与熊掌 发表于 2014-11-24 17:04:32

shafa/~~~~~~~~~~~~~~~~~

fan_zh 发表于 2014-11-24 17:27:20

黄工高产啊,收藏了

Gu_xl 发表于 2014-11-24 22:55:42

提供一种方法:
将多段线offset一个很小的数值d,然后再将偏移后的多段线偏移 -d,偏移回去后的多段线的长度若和原多段线长度一致,则多段线是非自交的,否则为自交多段线!

机械工程师 发表于 2014-11-25 08:19:41

g板的方法要测试才清楚。
自相交以为着有封闭区域,偏移时会自动分为几块偏移。
因此只要偏移回来的长度不一致,则可肯定自相交。
一致则很大几率不相交。

伪书虫86 发表于 2014-11-25 16:09:03

这个偏移有点高深
页: [1]
查看完整版本: ;;[功能] 判断多段线自交