chen3732088 发表于 7 天前

检查曲线相切、圆弧相切。

1、圆弧相切是圆弧圆心距是否与半径差(内切)或半径和(外切)相等。默认两圆弧端点重合。
2、曲线相切是求曲线端点的切线向量,然后判断两端点的单位向量积是否为1或-1。适用于直线和曲线,可检测两端点是否重合。

llsheng_73 发表于 6 天前

本帖最后由 llsheng_73 于 2025-4-24 18:20 编辑

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


无聊用院长的代码加上判断两ARC有无交点作为是否进一步计算的依据
(defun c:ACA(/ e1 e2 s1 s2 r1 r2 dd)
(vl-load-com)
(if (and (setq e1 (car (entsel "\n选择第一条弧<退出>: ")))
           (vl-position'(0 . "ARC")(setq s1(entget e1)))
         (setq e2 (car (entsel "\n选择第二条弧<退出>: ")))
           (vl-position'(0 . "ARC")(setq s2(entget e2)))
         (not(equal e1 e2))
           (>(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)
           (setq r1(cdr(assoc 40 s1))
               r2(cdr(assoc 40 s2))
               dd(distance(cdr(assoc 10 s1))(cdr(assoc 10 s2))))
           (vl-some'(lambda(x)(equal dd(eval x)1e-6))'((+ r1 r2)(abs(- r1 r2)))))
    (alert "两弧相切")
    (alert "两弧不相切"))
)

moranyuyan 发表于 7 天前

谢谢分享:handshake

qazxswk 发表于 7 天前

支持源码。

xyp1964 发表于 6 天前


(defun c:ACA ()
(defun DXF (code e) (cdr (assoc code (entget e))))
(if (and (setq s1 (car (entsel "\n选择第一条弧<退出>: ")))
         (setq s2 (car (entsel "\n选择第二条弧<退出>: ")))
         (equal (DXF 0 s1) "ARC")
         (equal (DXF 0 s2) "ARC")
         (not (equal s1 s2))
      )
    (progn
      (setq r1(DXF 40 s1)
            r2(DXF 40 s2)
            c1(DXF 10 s1)
            c2(DXF 10 s2)
            sum (+ r1 r2)
            dr(abs (- r1 r2))
            dd(distance c1 c2)
      )
      (if (or (equal dd sum 1e-6) (equal dd dr 1e-6))
      (alert "两弧相切")
      (alert "两弧不相切")
      )
    )
)
(princ)
)

zgs378530220 发表于 5 天前


支持源码。

xyp1964 发表于 4 天前

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

;; 交点法就简单多了
(defun c:tt ()
(defun DXF (code e) (cdr (assoc code (entget e))))
(if (and (setq s1 (car (entsel "\n选择第一条弧<退出>: ")))
         (setq s2 (car (entsel "\n选择第二条弧<退出>: ")))
         (equal (DXF 0 s1) "ARC")
         (equal (DXF 0 s2) "ARC")
         (not (equal s1 s2))
         (= (length (xyp-Inters s1 s2 0)) 1);只有一个交点
         (= (length (xyp-Inters s1 s2 3)) 1);两弧延伸后也只有一个交点
      )
    (alert "两弧相切")
    (alert "两弧不相切")
)
(princ)
)
页: [1]
查看完整版本: 检查曲线相切、圆弧相切。