明经CAD社区

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 786|回复: 6

[源码] 检查曲线相切、圆弧相切。

[复制链接]
发表于 2025-4-23 13:53:19 | 显示全部楼层 |阅读模式
1、圆弧相切是圆弧圆心距是否与半径差(内切)或半径和(外切)相等。默认两圆弧端点重合。
2、曲线相切是求曲线端点的切线向量,然后判断两端点的单位向量积是否为1或-1。适用于直线和曲线,可检测两端点是否重合。

本帖子中包含更多资源

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

x

评分

参与人数 3明经币 +3 金钱 +5 收起 理由
tigcat + 1 很给力!
moranyuyan + 1 + 5 很给力!
USER2128 + 1 赞一个!

查看全部评分

回复

使用道具 举报

发表于 2025-4-24 17:32:06 | 显示全部楼层
本帖最后由 llsheng_73 于 2025-4-24 18:20 编辑

好象都有点问题,第一个是强行要求两个圆弧端点重合,不然不进行行判断
院长只计算圆心距与半径和(差)比较,没有管它们实际有无切点


无聊用院长的代码加上判断两ARC有无交点作为是否进一步计算的依据
  1. (defun c:ACA(/ e1 e2 s1 s2 r1 r2 dd)
  2.   (vl-load-com)
  3.   (if (and (setq e1 (car (entsel "\n选择第一条弧<退出>: ")))
  4.            (vl-position'(0 . "ARC")(setq s1(entget e1)))
  5.            (setq e2 (car (entsel "\n选择第二条弧<退出>: ")))
  6.            (vl-position'(0 . "ARC")(setq s2(entget e2)))
  7.            (not(equal e1 e2))
  8.            (>(vlax-safearray-get-u-bound(vlax-variant-value(vlax-invoke-method(vlax-ename->vla-object e1)'IntersectWith(vlax-ename->vla-object e2)0))1)0)
  9.            (setq r1(cdr(assoc 40 s1))
  10.                  r2(cdr(assoc 40 s2))
  11.                  dd(distance(cdr(assoc 10 s1))(cdr(assoc 10 s2))))
  12.            (vl-some'(lambda(x)(equal dd(eval x)1e-6))'((+ r1 r2)(abs(- r1 r2)))))
  13.     (alert "两弧相切")
  14.     (alert "两弧不相切"))
  15. )


本帖子中包含更多资源

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

x

评分

参与人数 1明经币 +1 收起 理由
chen3732088 + 1 赞一个!

查看全部评分

回复 支持 1 反对 0

使用道具 举报

发表于 2025-4-24 16:57:33 | 显示全部楼层
  1. (defun c:ACA ()
  2.   (defun DXF (code e) (cdr (assoc code (entget e))))
  3.   (if (and (setq s1 (car (entsel "\n选择第一条弧<退出>: ")))
  4.            (setq s2 (car (entsel "\n选择第二条弧<退出>: ")))
  5.            (equal (DXF 0 s1) "ARC")
  6.            (equal (DXF 0 s2) "ARC")
  7.            (not (equal s1 s2))
  8.       )
  9.     (progn
  10.       (setq r1  (DXF 40 s1)
  11.             r2  (DXF 40 s2)
  12.             c1  (DXF 10 s1)
  13.             c2  (DXF 10 s2)
  14.             sum (+ r1 r2)
  15.             dr  (abs (- r1 r2))
  16.             dd  (distance c1 c2)
  17.       )
  18.       (if (or (equal dd sum 1e-6) (equal dd dr 1e-6))
  19.         (alert "两弧相切")
  20.         (alert "两弧不相切")
  21.       )
  22.     )
  23.   )
  24.   (princ)
  25. )

评分

参与人数 1明经币 +1 收起 理由
chen3732088 + 1

查看全部评分

回复 支持 反对

使用道具 举报

发表于 2025-4-26 10:40:55 | 显示全部楼层
llsheng_73 发表于 2025-4-24 17:32
好象都有点问题,第一个是强行要求两个圆弧端点重合,不然不进行行判断
院长只计算圆心距与半径和(差)比较 ...

;; 交点法就简单多了
  1. (defun c:tt ()
  2.   (defun DXF (code e) (cdr (assoc code (entget e))))
  3.   (if (and (setq s1 (car (entsel "\n选择第一条弧<退出>: ")))
  4.            (setq s2 (car (entsel "\n选择第二条弧<退出>: ")))
  5.            (equal (DXF 0 s1) "ARC")
  6.            (equal (DXF 0 s2) "ARC")
  7.            (not (equal s1 s2))
  8.            (= (length (xyp-Inters s1 s2 0)) 1);只有一个交点
  9.            (= (length (xyp-Inters s1 s2 3)) 1);两弧延伸后也只有一个交点
  10.       )
  11.     (alert "两弧相切")
  12.     (alert "两弧不相切")
  13.   )
  14.   (princ)
  15. )
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-4 04:18 , Processed in 0.157119 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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