两条平行的多段线加半圆凸头
本帖最后由 bluelover 于 2021-6-11 15:19 编辑通过偏移得到两条平行多段线。
然后想给这两条多段线的两头各加上一个半圆使之变成圆头管状。
怎么确保画出来的半圆如示意图中的红色外凸,而不是黄色内凹呢?(不小心上传了两张图片,不知道怎么删除~~)我知道这个问题等同于判断顺时针还是逆时针的问题,可以用格林公式判断。
但实际上我的多段线包含了大量直线和圆弧,用格林公式会增加很多计算量。
想知道有没有比较简单的判别方法。
感谢赐教!
本帖最后由 bluelover 于 2021-6-11 15:34 编辑
想到一个办法,给有需要的人参考吧。
如果各位有更好的方式也欢迎赐教。
1)两头的端点先用直线连接
2)两条直线和两条多段线在一起生成一个面域
3)两头绘制两个圆,并生成面域
4)步骤2)和步骤3)的三个面域取并集
(defun c:test()
(setq cmd (getvar "cmdecho"))
(setq osm (getvar "osmode"))
(setvar "cmdecho" 0)
(setvar "osmode" 0)
(command "_undo" "be")
(defun xlcj(xp1 Xp2 Xp3 )
(setq mjz (+ (- (* (car xp1) (cadr xp2)) (* (car xp2) (cadr xp1)))
(- (* (car xp2) (cadr xp3)) (* (car xp3) (cadr xp2)))
(- (* (car xp3) (cadr xp1)) (* (car xp1) (cadr xp3)))
)
)
)
(while (and (setq ssa (ssget ":S" '((0 . "lwpolyline"))))
(setq ssb (ssget ":S" '((0 . "lwpolyline"))))
)
(progn
(setq pta (mapcar 'cdr (vl-remove-if-not '(lambda(a)
(= (car a) 10)
)
(entget (ssname ssa 0))
)
)
)
(setq ptb (mapcar 'cdr (vl-remove-if-not '(lambda(b)
(= (car b) 10)
)
(entget (ssname ssb 0))
)
)
)
(if (> (distance (car pta) (car ptb))
(distance (car pta) (last ptb))
)
(setq ptb (reverse ptb))
)
(setq pta1 (reverse pta))
(setq sjlb (list (list (cadr pta)(car pta)(car ptb))
(list (cadr pta1) (car pta1) (last ptb))
)
)
(mapcar '(lambda(sjb)
(mapcar 'set '(p1 p2 p3) sjb)
(setq pmind (mapcar '(lambda(a b)(* 0.5 (+ a b))) p2 p3))
(setq R (* 0.5 (distance p2 p3)))
(setq ang (- (angle p2 p3) (* 0.5 pi)))
(setq p4 (polar pmind ang R))
(setq p5 (polar pmind ang (* -1.0 R)))
(if (> (/ (xlcj p1 p2 p3) (xlcj p2 p4 p5)) 0.0)
(setq pt p4)
(setq pt p5)
)
(command "pline" p2 "a" "s" pt p3 "")
)
sjlb
)
)
)
(command "_undo" "e")
(setvar "osmode" osm)
(setvar "cmdecho" cmd)
(princ)
) 谢谢回复。
不是太懂LISP,可以分享下增加半圆的算法吗? 好贴子,顶起顶起,感谢大神帮助
页:
[1]