zebulon_ Posté(e) le 12 mars 2012 Posté(e) le 12 mars 2012 Bonjour, Le but est de trouver les 2 tangentes communes intérieures à 2 cercles, sans utiliser les accrochages aux objets. (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 ? MerciAmicalementVincent 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)
(gile) Posté(e) le 12 mars 2012 Posté(e) le 12 mars 2012 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
zebulon_ Posté(e) le 12 mars 2012 Auteur Posté(e) le 12 mars 2012 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 AmicalementVincent 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)
didier Posté(e) le 13 mars 2012 Posté(e) le 13 mars 2012 Coucou je ne suis pas très présent ces temps-cimais je viens de temps en temps tout de même... à une époque j'avais sévi dans le sujet :sur mon site amicalement Éternel débutant... Mon site perso : Programmer dans AutoCAD
Messages recommandés
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 compteSe connecter
Vous avez déjà un compte ? Connectez-vous ici.
Connectez-vous maintenant