Aller au contenu

Messages recommandés

Posté(e)

Bonjour,

 

Le but est de trouver les 2 tangentes communes intérieures à 2 cercles, sans utiliser les accrochages aux objets.post-358-0-45382200-1331561031_thumb.jpg

 

(defun vlax-list->3D-point (lst / nlst)
 (while lst
   (setq nlst (cons (list (car lst) (cadr lst) (caddr lst)) nlst))
   (setq lst (cdddr lst))
 )
 (reverse nlst)
)

;;; Clockwise-p
;;; Retourne T si les points p1 p2 et p3 tournent dans le sens horaire

(defun clockwise-p (p1 p2 p3)
(< (sin (- (angle p1 p3) (angle p1 p2))) -1e-14)
)

(defun tcc
   (
     C1	;; le cercle C1
     C2	;; le cercle C2
     /
     O1	;; le centre du cercle C1
     O2	;; le centre du crecle C2
     R1	;; le rayon du cercle C1
     R2	;; le rayon du cercle C2
     ANG	;; le gisement du segment O1 O2
     A1	;; le point sur C1 tel que O1 A1 est perpendiculaire à + 90° à O1 O2
     A2	;; le point sur C2 tel que O2 A2 est perpendiculaire à - 90° à O1 O2
     J		;; intersection entre A1 A2 et O1 O2
     Q1	;; centre du segment O1 J
     Q2	;; centre du segment O2 J
     T1	;; cercle de centre Q1 et de diamètre O1 J
     T2	;; cercle de centre Q2 et de diamètre O2 J
     L1	;; liste des points d'intersection entre C1 et T1
     L2	;; liste des points d'intersection entre C2 et T2
     T1C1	;; premier point de tangence sur C1
     T2C1	;; deuxième point de tangence sur C1
     T1C2	;; premier point de tangence sur C2
     T2C2	;; deuxième point de tangence sur C2
   )

 (vl-load-com)

 ;;; tangente intérieure 2 cercles

 (setq O1 (vlax-get C1 'Center))
 (setq O2 (vlax-get C2 'Center))
 (setq R1 (vlax-get C1 'Radius))
 (setq R2 (vlax-get C2 'Radius))
 (setq ANG (angle O1 O2))
 (setq A1 (polar O1 (+ ANG (/ pi 2)) R1))
 (setq A2 (polar O2 (- ANG (/ pi 2)) R2))
 (setq J (inters A1 A2 O1 O2))
 (setq Q1 (polar O1 (angle O1 J) (/ (distance O1 J) 2)))
 (setq Q2 (polar O2 (angle O2 J) (/ (distance O2 J) 2)))
 (setq T1
      (vlax-invoke
        (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))
        'AddCircle
        Q1
        (/ (distance O1 J) 2)
      )
 )
 (setq T2
      (vlax-invoke
        (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))
        'AddCircle
        Q2
        (/ (distance O2 J) 2)
      )
 )
 (setq L1 (vlax-list->3D-point (vlax-invoke C1 'IntersectWith T1 acExtendNone)))
 (setq L2 (vlax-list->3D-point (vlax-invoke C2 'IntersectWith T2 acExtendNone)))
 (vla-delete T1)
 (vla-delete T2)
 (setq
   T1C1 (car L1)
   T2C1 (cadr L1)
   T1C2 (car L2)
   T2C2 (cadr L2)
 )
 (if (clockwise-p O1 O2 T1C1)
   (setq 
     TEMP T1C1
     T1C1 T2C1
     T2C1 TEMP   
   )
 )
 (if (clockwise-p O2 O1 T1C2)
   (setq 
     TEMP T1C2
     T1C2 T2C2
     T2C2 TEMP   
   )
 )

 (list T1C1 T1C2 T2C1 T2C2)
)

(defun c:testtcc ( / C1 C2 LST LT1 LT2)
 ;; les 2 cercles
 (setq C1 (vlax-ename->vla-object (car (entsel "\nSaisir cercle 1 : "))))
 (setq C2 (vlax-ename->vla-object (car (entsel "\nSaisir cercle 2 : "))))
 (setq LST (tcc C1 C2))
 (setq LT1
      (vlax-invoke
        (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))
        'AddLine
        (nth 0 LST)
        (nth 1 LST)
      )
 )
 (setq LT2
      (vlax-invoke
        (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))
        'AddLine
        (nth 2 LST)
        (nth 3 LST)
      )
 )
 (princ)
)

 

Il y a peut être plus simple ?

 

Merci

Amicalement

Vincent

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Posté(e)

Salut,

 

Les triangles (J, T1C1, O1), (J, T2C1, 1), (J, T1C2, O2) et (J, T2C2, O2) sont des triangles rectangles, ils sont semblables (ou égaux).

 

;; Arc cosinus
(defun acos (num)
 (cond
   ((equal num 1 1e-9) 0.0)
   ((equal num -1 1e-9) pi)
   ((< -1 num 1)
    (atan (sqrt (- 1 (expt num 2))) num)
   )
 )
)

;; Points de tangence des tangentes extérieures (deux sous-listes de deux points)
(defun tangentExt (circle1 circle2 / elst1 elst2 rad1 rad2 cen1 cen2 ang1 ang2)
 (setq elst1 (entget circle1)
       elst2 (entget circle2)
       rad1  (cdr (assoc 40 elst1))
       rad2  (cdr (assoc 40 elst2))
       cen1  (cdr (assoc 10 elst1))
       cen2  (cdr (assoc 10 elst2))
 )
 (if (< (- rad2 rad1) (distance cen1 cen2))
   (progn
     (setq ang1 (angle cen2 cen1)
           ang2 (acos (/ (- rad2 rad1) (distance cen1 cen2)))
     )
     (list
       (list (polar cen1 (+ ang1 ang2) rad1) (polar cen2 (+ ang1 ang2) rad2))
       (list (polar cen1 (- ang1 ang2) rad1) (polar cen2 (- ang1 ang2) rad2))
     )
   )
 )
)

;; Points de tangence des tangentes intérieures (deux sous-listes de deux points)
(defun tangentInt (circle1 circle2 / elst1 elst2 rad1 rad2 cen1 cen2 ratio)
 (setq elst1 (entget circle1)
       elst2 (entget circle2)
       rad1  (cdr (assoc 40 elst1))
       rad2  (cdr (assoc 40 elst2))
       cen1  (cdr (assoc 10 elst1))
       cen2  (cdr (assoc 10 elst2))
 )
 (if (< (+ rad1 rad2) (distance cen1 cen2))
   (progn
     (setq ratio (/ rad1 (+ rad1 rad2))
           ang1  (angle cen1 cen2)
           ang2  (acos (/ rad1 (* (distance cen1 cen2) ratio)))
     )
     (list
       (list (polar cen1 (+ ang1 ang2) rad1) (polar cen2 (+ ang1 pi ang2) rad2))
       (list (polar cen1 (- ang1 ang2) rad1) (polar cen2 (- ang1 pi ang2) rad2))
     )
   )
 )
)

;; Commande de test
(defun c:test (/ c1 c2 ext int)
 (and
   (setq c1 (car (entsel)))
   (setq c2 (car (entsel)))
   (setq ext (tangentExt c1 c2))
   (entmake
     (list '(0 . "LINE") (cons 10 (caar ext)) (cons 11 (cadar ext)) '(62 . 1))
   )
   (entmake
     (list '(0 . "LINE") (cons 10 (caadr ext)) (cons 11 (cadadr ext)) '(62 . 1))
   )
   (setq int (tangentInt c1 c2))
   (entmake
     (list '(0 . "LINE") (cons 10 (caar int)) (cons 11 (cadar int)) '(62 . 3))
   )
   (entmake
     (list '(0 . "LINE")( cons 10 (caadr int))( cons 11 (cadadr int)) '(62 . 3))
   )
 )
 (princ)
)

Gilles Chanteau - gileCAD - GitHub
Développements sur mesure pour AutoCAD

Posté(e)

Merci pour le complément fort instructif.

 

Les triangles (J, T1C1, O1), (J, T2C1, O1), (J, T1C2, O2) et (J, T2C2, O2) sont des triangles rectangles, ils sont semblables (ou égaux).

 

Je rajouterai que J est centre d'homothétie et que, forcément, les triangles sont rectangles puisque par définition la tangente est perpendiculaire au rayon.

 

Si j'avais voulu résoudre le problème de tangente extérieure graphiquement, j'aurai dû déterminer les points A1 et A2 du même côté (et non pas une fois à droite, une fois à gauche). L'intersection entre O1, O2, A1, A2 donne le centre d'homothétie I qui permet de trouver les points de tangence extérieurs. Cette méthode a une limite : lorsque les 2 cercles ont le même rayon, ce point I est renvoyé à l'infini

 

Amicalement

Vincent

C'est au pied du mur que l'on reconnaît le maçon ! (Anonyme)

C’est en restant au pied du mur qu’on ne voit que le mur (Anonyme aussi)

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer. Politique de confidentialité