明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 680|回复: 4

两条平行的多段线加半圆凸头

[复制链接]
发表于 2021-6-11 15:08 | 显示全部楼层 |阅读模式
本帖最后由 bluelover 于 2021-6-11 15:19 编辑

通过偏移得到两条平行多段线。
然后想给这两条多段线的两头各加上一个半圆使之变成圆头管状。
怎么确保画出来的半圆如示意图中的红色外凸,而不是黄色内凹呢?(不小心上传了两张图片,不知道怎么删除~~)我知道这个问题等同于判断顺时针还是逆时针的问题,可以用格林公式判断。
但实际上我的多段线包含了大量直线和圆弧,用格林公式会增加很多计算量。
想知道有没有比较简单的判别方法。
感谢赐教!




本帖子中包含更多资源

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

x
 楼主| 发表于 2021-6-11 15:27 | 显示全部楼层
本帖最后由 bluelover 于 2021-6-11 15:34 编辑

想到一个办法,给有需要的人参考吧。
如果各位有更好的方式也欢迎赐教。
1)两头的端点先用直线连接
2)两条直线和两条多段线在一起生成一个面域
3)两头绘制两个圆,并生成面域
4)步骤2)和步骤3)的三个面域取并集
发表于 2021-6-12 09:29 | 显示全部楼层
(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)
)
 楼主| 发表于 2021-6-12 15:14 | 显示全部楼层
谢谢回复。
不是太懂LISP,可以分享下增加半圆的算法吗?
发表于 2022-6-6 15:12 | 显示全部楼层
好贴子,顶起顶起,感谢大神帮助
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|CAD论坛|CAD教程|CAD下载|联系我们|关于明经|明经通道 ( 粤ICP备05003914号 )  
©2000-2023 明经通道 版权所有 本站代码,在未取得本站及作者授权的情况下,不得用于商业用途

GMT+8, 2024-5-5 12:41 , Processed in 0.705101 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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