乐筑天下

搜索
欢迎各位开发者和用户入驻本平台 尊重版权,从我做起,拒绝盗版,拒绝倒卖 签到、发布资源、邀请好友注册,可以获得银币 请注意保管好自己的密码,避免账户资金被盗
查看: 120|回复: 4

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

[复制链接]

24

主题

83

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
179
发表于 2021-6-11 15:08:00 | 显示全部楼层 |阅读模式
通过偏移得到两条平行多段线。
然后想给这两条多段线的两头各加上一个半圆使之变成圆头管状。

dlv5eil0ldj.png

dlv5eil0ldj.png


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

pas3ttvv4yo.png

pas3ttvv4yo.png

回复

使用道具 举报

24

主题

83

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
179
发表于 2021-6-11 15:27:00 | 显示全部楼层

想到一个办法,给有需要的人参考吧。
如果各位有更好的方式也欢迎赐教。
1)两头的端点先用直线连接
2)两条直线和两条多段线在一起生成一个面域
3)两头绘制两个圆,并生成面域
4)步骤2)和步骤3)的三个面域取并集
回复

使用道具 举报

14

主题

404

帖子

13

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
455
发表于 2021-6-12 09:29:00 | 显示全部楼层
(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)
)
回复

使用道具 举报

24

主题

83

帖子

7

银币

初露锋芒

Rank: 3Rank: 3Rank: 3

铜币
179
发表于 2021-6-12 15:14:00 | 显示全部楼层
谢谢回复。
不是太懂LISP,可以分享下增加半圆的算法吗?
回复

使用道具 举报

35

主题

311

帖子

14

银币

后起之秀

Rank: 20Rank: 20Rank: 20Rank: 20

铜币
447
发表于 2022-6-6 15:12:00 | 显示全部楼层
好贴子,顶起顶起,感谢大神帮助
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 微信公众平台

  • 扫描访问手机版

  • 点击图片下载手机App

QQ|关于我们|小黑屋|乐筑天下 繁体中文

GMT+8, 2024-11-22 01:32 , Processed in 0.150077 second(s), 65 queries .

© 2020-2024 乐筑天下

联系客服 关注微信 帮助中心 下载APP 返回顶部 返回列表