(gile) Posté(e) le 19 mai 2007 Posté(e) le 19 mai 2007 Allez, un peu de géométrie. Il s'agit de faire une routine qui évalue si deux droites, définies respectivement par les points p1, p2 et p3, p4 sont parallèles. Exemple : (parallel-p p1 p2 p3 p4) retourne T si p1 p2 est parallèle à p3 p4 PS : p1 p2 p3 p4 sont des points 3d, bien sûr. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lecrabe Posté(e) le 19 mai 2007 Posté(e) le 19 mai 2007 Bonsoir (gile) Tu veux nous faire résoudre un système d'équationet/ou faire un peu de calcul matriciel ? Amicalement, Le Decapode (qui a un peu oublié ses maths) Autodesk Expert Elite Team
(gile) Posté(e) le 19 mai 2007 Auteur Posté(e) le 19 mai 2007 Non, non pas besoin de matrices... Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lovecraft Posté(e) le 19 mai 2007 Posté(e) le 19 mai 2007 bonsoir,hem dis moi gile.... juste une p'tite idée si nous comparons juste le gisement des droites, cela suffit pour determiner si elles sont parralleles?donc pas besoin de faire des calculs interminables ....@plus Ps :je suis entain de plancher pour le challenge debutant ;) et merci pour les conseils qui m'aident à progresser. http://www.youtube.com/user/CADMINATOR?feature=mhee
BIM G CO Posté(e) le 19 mai 2007 Posté(e) le 19 mai 2007 J'ai du mal à comprendre l'exercice, plus précisement le mot "parallèles" avec les mots "droite" et "3D". (gile) considères-tu des droites non coplanaires comme parallèles? Dessinateur AutoCAD, Modeleur BIM, consultant informatique logiciels métier Lenovo ThinkStation P330 i9 9900K 32Gb RAM 512 SSD + 1To GstarCAD, Fisa-CAD, Revit, FisaBIM CVC, Microsoft Office PlaquetteDeplianteMars2024.pdf
(gile) Posté(e) le 19 mai 2007 Auteur Posté(e) le 19 mai 2007 hem dis moi gile.... juste une p'tite idée si nous comparons juste le gisement des droites, cela suffit pour determiner si elles sont parralleles? La réponse est peut-être dans le doute sous-tendu par ta question... Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 19 mai 2007 Auteur Posté(e) le 19 mai 2007 Maximilien, je n'avais pas vu ton message. Au vu des questions, j'ai du mal m'exprimer ou voulu trop peu en dire. D'après les éléments d'Euclide (Définition 35) Les parallèles sont des droites qui, étant situées dans un même plan, et étant prolongées à l'infini de part et d'autre, ne se rencontrent ni d'un côté ni de l'autre Donc oui, les droites sont coplanaires, et par 3D j'entends que le plan qui les contient est un plan quelconque de l'espace. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lecrabe Posté(e) le 19 mai 2007 Posté(e) le 19 mai 2007 ReBonsoir Si je me souviens BIEN mais je vais peut être dire une grosse connerie !Soit 2 droites dont l'équation est:Y1 = A1 * X1 + B1Y2 = A2 * X2 + B2Si les 2 coefficients A1 et A2 sont égaux alors les droites sont // !? Je crois qu'il suffit de recréer l'équation des 2 droites depuis les 2 * 2 pointset donc de comparer A1 et A2 ... Je pense que c'est un problème de niveau 3èmé !? Le Decapode aux Maths nébuleuses Autodesk Expert Elite Team
(gile) Posté(e) le 19 mai 2007 Auteur Posté(e) le 19 mai 2007 Bravo lecrabe, c'est une approche possible. On appelle parfois la constante "a" de l'équation "y = ax + b" la pente de la droite. Et effectivement, quand les pentes sont égales les droites sont parallèles si... ...elle sont contenues (ou parallèles) au plan XY, sinon ce sont seulement leurs projections sur ce plan qui sont parallèles. Ça avance, on défriche ;) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 19 mai 2007 Posté(e) le 19 mai 2007 :cool: Allez... moi, je triche : je le fais graphiquement !(on est samedi soir, que diable !!!) (defun parallel-p (p1 p2 p3 p4 / ACDOC L1 L2 PT) (if (= (getvar "CVPORT") 1) (setq AcDoc (vla-get-PaperSpace (vla-get-ActiveDocument (vlax-get-acad-object)))) (setq AcDoc (vla-get-ModelSpace (vla-get-ActiveDocument (vlax-get-acad-object)))) ) (setq l1 (vla-AddLine AcDoc (vlax-3d-point p1) (vlax-3d-point p2)) l2 (vla-AddLine AcDoc (vlax-3d-point p3) (vlax-3d-point p4))) (setq pt (vlax-invoke l1 'IntersectWith l2 acExtendBoth)) (vla-delete l1) (vla-delete l2) (if pt nil t ) ) Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Patrick_35 Posté(e) le 19 mai 2007 Posté(e) le 19 mai 2007 Je n'ai pas vu de niveau, donc ma proposition (defun parallel-p (pt1 pt2 pt3 pt4) (eq (angle pt1 pt2)(angle pt3 pt4)) ) Et en pur autolisp ;) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 19 mai 2007 Auteur Posté(e) le 19 mai 2007 :mad: Pendant que je corrige, je ne peux pas faire le "challenge 4" C'est bien essayé tous les deux mais... Bred essaye avec (parallel-p '(-1 0 0) '(1 0 0) '(0 -1 1) '(0 1 1)) Patrick avec (parallel-p '(0 0 0) '(1 0 0) '(0 1 0) '(1 1 1)) Vos solutions ne fonctionnent pas si les droites ne sont pas coplanaires. PS : Bred, tu aurais pu faire directement(if (inters p1 p2 p3 p4 nil)nilT) [Edité le 19/5/2007 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 19 mai 2007 Posté(e) le 19 mai 2007 inters ???Connaissais pas.merci ! Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Bred Posté(e) le 19 mai 2007 Posté(e) le 19 mai 2007 Hey !!!mais ne viens tu pas de donner la réponse avec inters ??? Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Patrick_35 Posté(e) le 19 mai 2007 Posté(e) le 19 mai 2007 Et cette fois-ci ? (defun parallel-p (pt1 pt2 pt3 pt4) (and (eq (angle pt1 pt2)(angle pt3 pt4)) (eq (caddr pt1)(caddr pt3)) (eq (caddr pt1)(caddr pt4)) (eq (caddr pt2)(caddr pt3)) (eq (caddr pt2)(caddr pt4)) ) ) ps : il est vrai qu'inters marche aussi @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 19 mai 2007 Auteur Posté(e) le 19 mai 2007 Je crois que l'énnoncé nest pas clair. La routine doit retourner T si les droites sont parallèles et coplanaires, nil dans tous les autres cas, et ce, quelques soient les points 3d spécifiés. inters ne fonctionnerait que si on y ajoutait un test de coplanéarité (ça existe ce mot ?). Exemples : (parallel-p '(-1 1 1) '(3 2 0) '(-2 -1 4) '(6 1 2)) -> T (parallel-p '(-1 0 0) '(1 0 0) '(0 -1 1) '(0 1 1)) -> nil (parallel-p '(0 0 0) '(1 0 0) '(0 1 0) '(1 1 1)) -> nil Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 19 mai 2007 Posté(e) le 19 mai 2007 si les droites sont parallèles et coplanairesC'est bizarre...ça devrait alors fonctionner ça, non ? (defun parallel-p (p1 p2 p3 p4) (if (and (inters p1 p2 p3 p4 nil) (inters p1 p4 p2 p3 nil)) T nil ) ) ... ben non ... :casstet: [Edité le 19/5/2007 par Bred] Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Patrick_35 Posté(e) le 19 mai 2007 Posté(e) le 19 mai 2007 Eh non BredEn clair, il faut définir deux vecteurs qui vont dans la même direction, mais là, ça dépasse mes maigres connaissances en 3d @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
(gile) Posté(e) le 19 mai 2007 Auteur Posté(e) le 19 mai 2007 Non Bred, - si les droites ne sont pas coplanaires, il ne peut pas y avoir d'intersection mais elles ne peuvent être parallèles.- si elles son coplanaires et qu'il n'y a pas d'intersection, alors elles sont parallèles. Oui Patrick, c'est à mon avis, la meilleure approche. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Didier-AD Posté(e) le 19 mai 2007 Posté(e) le 19 mai 2007 En clair, il faut définir deux vecteurs qui vont dans la même direction, mais là, ça dépasse mes maigres connaissances en 3d @+ un vecteur directeur d'une droite passant par 2 points A(xa, ya,za) et B(xb,yb,zb) s'écrit tput simplement (xb-xa, yb-ya, zb-za) mais on ne peut pas comparer directement le vecteur issus de PT1 et ,PT2 et celui issu de PT et PT4 car, ils ne sont pas forcément de même longueur ;il faut les ramener à une unité(defun paral (p1 p2 p3 p4 / V1 V2) (setq v1 (mapcar '(lambda (c1 c2) (/ (- c2 c1) (distance p1 p2))) p1 p2)) (setq v2 (mapcar '(lambda (c1 c2) (/ (- c2 c1) (distance p3 p4))) p3 p4)) (and (eq (car v1) (car v2)) (eq (cadr v1) (cadr v2)) (eq (caddr v1) (caddr v2)) ) ) Notacelà nécessite une division de nombres réels donc une imprécision qui oblige souvent à délaisser eq au profit de equal
(gile) Posté(e) le 19 mai 2007 Auteur Posté(e) le 19 mai 2007 Chapeau bas, avec explications et tout... Ma solution favorite est similaire avec vec1, une routine que j'ai donné plusieurs fois ici pour calculer le vecteur unitaire entre 2 points. ;;; VEC1 Retourne le vecteur normé (1 unité) de p1 à p2 (defun vec1 (p1 p2) (if (not (equal p1 p2 1e-009)) (mapcar '(lambda (x1 x2) (/ (- x2 x1) (distance p1 p2)) ) p1 p2 ) ) ) (defun parallelp (p1 p2 p3 p4 / v1 v2) (and (setq v1 (vec1 p1 p2)) (setq v2 (vec1 p3 p4)) (or (equal v1 v2 1e-9) (equal v1 (mapcar '- v2) 1e-9) ) ) ) Je laisse passer un peu de temps avant de proposer une autre approche. [Edité le 19/5/2007 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lovecraft Posté(e) le 19 mai 2007 Posté(e) le 19 mai 2007 voila la mienne de réponse (defun parallel-p (P1 P2 P3 P4)(if(and(eq (angle P1 P2) (angle P3 P4))(eq (/ (-(caddr P1) (caddr P2)) (distance P1 P2)) (/ (-(caddr P1) (caddr P2)) (distance P1 P2))))Tnil)) J'espere que c'est bon?....... http://www.youtube.com/user/CADMINATOR?feature=mhee
(gile) Posté(e) le 19 mai 2007 Auteur Posté(e) le 19 mai 2007 J'espere que c'est bon?....... Je crains que non...De plus il me semble qu'il y a une erreur dans la dernière expression, tu compares les mêmes choses. Il est temps d'aller faire reposer les neurones, bonne nuit. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 20 mai 2007 Auteur Posté(e) le 20 mai 2007 J'ai peut-être posté un peu vite ma réponse, la solution de Didier présente quelques imperfections :- pas de test pour évaluer si les points sont confondus.- et surtout, echec suivant le sens du vecteur calculé : (paral '(-1 1 1) '(3 2 0) '(-2 -1 4) '(6 1 2)) -> T(paral '(-1 1 1) '(3 2 0) '(6 1 2) '(-2 -1 4)) -> nil Je rappelle qu'outre le calcul vectoriel utilisé dans les routines postées par Didier et moi, deux autres approches ont été évoquées : 1) la piste évoquée par lecrabeComparer les "pentes" à savoir la constante A de l'équation y = Ax + B définissant chaque droite (ou du moins sa projection) dans le plan XY.J'ai une solution (pas très élégante) qui utilise cette voie. 2) celle tentée par BredQue les deux droites remplissent deux conditions : ne pas avoir d'intersection et être coplanaires. Ce qui revient à déplacer le problème : évaluer la coplanéarité des points (l'intersection ne posant pas de problème).J'ai bien une routine (coplanp) qui évalue si les points d'une liste sont coplanaires mais elle s'appuie sur l'intersection ou le parallélisme des droites définies par les points, donc on tourne en rond.J'avoue ne pas avoir creuser plus que ça cette piste. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lovecraft Posté(e) le 20 mai 2007 Posté(e) le 20 mai 2007 bonjour le voici corrigé (defun parallel-p (P1 P2 P3 P4)(if(and(eq (angle P1 P2) (angle P3 P4))(eq (/ (-(caddr P1) (caddr P2)) (distance P1 P2)) (/ (-(caddr P3) (caddr P4)) (distance P3 P4))))Tnil)) Normalement il fonctionne bien je viens de le tester sur autocad avec les exemples que tu as donner plus hautil compare l'angle donc le gisement et l'inclinaison soit la pente (ce qui confirme que les droites sont sur le meme plan.ert je pense que j'ai reussi le challenge car je n'utilise que les parametre que tu as defini dans l'ennoncé.@plus http://www.youtube.com/user/CADMINATOR?feature=mhee
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