(gile) Posté(e) le 20 mai 2007 Auteur Posté(e) le 20 mai 2007 Très très intéressant, BRAVO :D Je vois encore 3 petits dysfonctionnements comme pour Didier, 1) ta routine tient compte du sens dans lequel sont donnés les points de chaque droite, il ne faudrait pas.Une droite du plan XY à 30° est parallèle à une autre à 210°Essaye avec les points donnés dans mon dernier message, les deux devraient retourner T. 2) il pourrait être utile de faire un test pour s'assurer que P1 n'est pas confondu avec P2, de même pur P3 et P4 afin d'éviter un message d'erreur du style : "; erreur: division par zéro" 2) comme le dit Didier, comparer des points 3d nécessite souvent une petite tolérance, il faut utiliser equal plutôt que eq avec un fuzz (regarde la routine que j'ai posté). Sinon, pour gagner quelques lignes : (and ...) retourne T si aucune des expressions évaluées n'a retourné nil, autrement nil.Tu n'as donc pas besoin de faire un (if ...) Encore BRAVO, une fois mis au propre, je pense que tu auras écrit la routine la plus concise de ce challenge. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
lecrabe Posté(e) le 20 mai 2007 Posté(e) le 20 mai 2007 Coucou *** Challenge BIS : Les 2 droites coplanaires sont elles perpendiculaires ?Coordonnées XY de l'intersection ? *** Challenge suivant dans l'espace 3D, mêmes questions:A mon avis, c'est surement plutôt de niveau Terminale S 2 droites passant par :- X1,Y1,Z1 et X2,Y2,Z2 d'une part - X3,Y3,Z3 et X4,Y4,Z4 d'autre part Les 2 droites 3D sont elles:- 1) Coplanaires ?- 2) Parallèles ?- 3) En intersection (Miracle Niveau 2), coordonnées XYZ de l'intersection ?- 4) En intersection et en plus perpendiculaires (Miracle Niveau 3), coordonnées XYZ de l'intersection ? Le Decapode (qui a tout oublié de son Bac C, il y a 30 ans environ) [Edité le 20/5/2007 par lecrabe] Autodesk Expert Elite Team
Didier-AD Posté(e) le 20 mai 2007 Posté(e) le 20 mai 2007 pour les parallèles on peut utiliser aussi le produit vectoriel, c'est le plus sûrsi le produit vectoriel des deux vecteurs est un vecteur nul alors les vecteurs sont colinéaires donc parallèlesvoici (defun pvectoriel (V1 V2) ; ajouter si nécessaire la coordonnée Z à V1 (if (not (caddr V1)) (setq V1 (append V1 (list 0)))) ; ajouter si nécessaire la coordonnée Z à V2 (if (not (caddr V2)) (setq V2 (append V2 (list 0)))) (list (- (* (cadr V1)(caddr V2)) (* (caddr V1) (cadr V2))) (- (* (car V1)(caddr V2)) (* (caddr V1) (car V2))) (- (* (car V1)(cadr V2)) (* (cadr V1) (car V2))) ) ) (defun paral (p1 p2 p3 p4) (equal (apply '+ (pvectoriel (mapcar '- P2 P1) (mapcar '- P3 P4))) 0 1e-9) ) pour les perpendiculaire, c'est le produit scalaire qu'il faut utiliseril est nul si les vecteurs sont perpendiculaires (defun Pscalaire (V1 V2) (apply '+ (mapcar '* V1 V2)) ) (defun perpend (P1 P2 P3 p4 / pint) (if (equal (pscalaire (mapcar '- P2 P1) (mapcar '- P3 P4)) 0 1e-9) (if (setq pint (inters p1 p2 p3 p4 nil) pint (print "perpendiculaires mais non coplanaires") ) (print "non coplanaires") ) )
Bred Posté(e) le 20 mai 2007 Posté(e) le 20 mai 2007 Salut,- 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.ça je le sais bien, mais est-ce que ma logique est fausse si je prétend que si 2 droites sont coplanaire, il y a intersection entre la diagonale de leur points opposés ?(en fait je me rends compte que mon test était faux)je voulais écrire :(defun parallel-p (p1 p2 p3 p4) (if (and (not (inters p1 p2 p3 p4 nil)) (inters p1 p4 p3 p2 nil)) T nil) ) Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 20 mai 2007 Auteur Posté(e) le 20 mai 2007 Didier,J'aime beaucoup ces utilisations de calcul vectoriel. lecrabe, pour les perpendiculaires, j'aurais dit comme Didier (produit scalaire nul + intersection)pour les autres, je vais tacher d'y réfléchir. Bred, Vraiment très intéressant, je n'avais pas compris hier soir. Mais il faudrait tester les diagos dans les deux sens :(parallel-p '(0 2 0) '(2 2 0) '(3 1 0) '(5 1 0)) retourne T OK(parallel-p '(0 2 0) '(2 2 0) '(5 1 0) '(3 1 0)) retourne nil mais devrait retourner TD'autre part, comme je disais à Lovecraft, (and ...) retournant T ou nil, tu peux éviter le (if ...) Lovecraft,Je me suis peut-être embalé un peu vite, ta routine n'est pas si facile à fixer, en plus des angles projetés sur le plan XY qui doivent être comparés à pi radians près, la comparaison des gisements peut retourner T ou nil suivant l'ordre dans lequel sont exprimés les points. En voici une autre, qui compare les angles (à pi près) projetés des deux droites sur les 3 plans XY, YZ et ZX. (defun parallel-p (p1 p2 p3 p4) (defun ang-lst (p1 p2) (mapcar '(lambda (a) (if ( a (- a pi) ) ) (list (angle (list (car p1) (cadr p1)) ; angle projeté sur XY (list (car p2) (cadr p2))) (angle (list (cadr p1) (caddr p1)); angle projeté sur YZ (list (cadr p2) (caddr p2)) ) (angle (list (caddr p1) (car p1)); angle projeté sur ZX (list (caddr p2) (car p2)) ) ) ) ) (equal (ang-lst p1 p2) (ang-lst p3 p4) 1e-9) ) [Edité le 20/5/2007 par (gile)] Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 20 mai 2007 Posté(e) le 20 mai 2007 Vu et fait (gile) :(defun parallel-p (p1 p2 p3 p4) (and (not (inters p1 p2 p3 p4 nil)) (or (inters p1 p4 p3 p2 nil) (inters p1 p3 p2 p4 nil)) ) ) Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
(gile) Posté(e) le 20 mai 2007 Auteur Posté(e) le 20 mai 2007 Je n'ai pas testé en profondeur, mais ça me semble parfait. Tu as toute mon admiration, tu as su utiliser des fonctions LISP sans te perdre dans des calculs géométriques complexes. BRAVO, BRAVO, BRAVO :D :D :D Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Bred Posté(e) le 20 mai 2007 Posté(e) le 20 mai 2007 Tu as toute mon admirationça me touche vraiment, merci !La fonction "inters" est tout de même encore quelque chose que tu m'as appris !(dans la multitude que tu m'as appris, c'est une nouvelle chose !) Si vous êtes persuadés de tout savoir sur un sujet, c''est que vous en ignorez quelque chose...
Patrick_35 Posté(e) le 20 mai 2007 Posté(e) le 20 mai 2007 Merci Didier, mes études n'ont pas été à ce niveau, mais je ruse ;) Donc ma solution pour le premier excercice et sans vecteur (defun parallel-p(pt1 pt2 pt3 pt4 / yz) (defun yz(pt) (list (cadr pt) (caddr pt)) ) (and (eq (angle pt1 pt2) (angle pt3 pt4)) (eq (angle (yz pt1) (yz pt2)) (angle (yz pt3) (yz pt4))) ) ) @+ 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 20 mai 2007 Auteur Posté(e) le 20 mai 2007 Bien essayé Patrick, mais pour n'écarter aucune éventualité il faut tester les angles à pi radians près (angle p1 p2) ou (angle p2 p1) et sur les 3 plans XY YZ et ZX. Regarde le code donné Réponse 29 (je crois que les liens ne marchent plus quand le sujet dépasse 1 page) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Patrick_35 Posté(e) le 20 mai 2007 Posté(e) le 20 mai 2007 ah oui, je n'avais pas fait attention ! :red: J'avoue ne pas tout saisir, et ne perds pas ton temps à essayer de m'expliquer, j'ai vraiment du mal avec la 3DMais ma démarche avec xy et yz n'est pas si mal ;) @+ Les Lisps de PatrickLe but n'est pas toujours placé pour être atteint, mais pour servir de point de mire.Joseph Joubert, 1754-1824
bonuscad Posté(e) le 21 mai 2007 Posté(e) le 21 mai 2007 Je vois que le week-end de l'ascension a été fertile aux lispeurs, Didier,J'aime beaucoup ces utilisations de calcul vectoriel. Bon je vais pas faire de proposition, car ce que j'utilise pour ce genre de calcul vectoriel et tiré d'une page allemande , donc aucun honneur pour moi. Mais ces routines proposées me semblent fiables car j'ai toujours pu les mettre en application avec les résultats escomptés dans mes propres routines. Choisissez un travail que vous aimez et vous n'aurez pas à travailler un seul jour de votre vie. - Confucius
ElpanovEvgeniy Posté(e) le 21 mai 2007 Posté(e) le 21 mai 2007 bonjour :) (defun check_inters (p1 p2 p3 p4) ;; By ElpanovEvgeniy ;; Check intersect two lines ;; only 2D (equal (apply '- (mapcar '* (cdr (reverse (mapcar '- p4 p3))) (mapcar '- p2 p1))) 0. 1e-8 ) ) Evgeniy
(gile) Posté(e) le 21 mai 2007 Auteur Posté(e) le 21 mai 2007 En lançant ce "challenge" je doutais un peu de l'intérêt qu'il pouvait avoir et de celui qu'il pourrait susciter.Je suis doublement comblé, par le nombre des réponses et par le plaisir que j'ai eu à creuser ou à découvir les approches des uns et des autres.Merci à tous, c'est un vrai bonheur, et c'est pas fini...Quelques commentaires. Bred,Je suis toujours bluffé, non, vexé, que tu m'aies montré mon nez au milieu de ma figure. Didier,Je pense que l'expression (equal (apply '+ (pvectoriel (mapcar '- P2 P1) (mapcar '- P3 P4))) 0 1e-9), fort élégante au demeurant, n'est pas fiable pour évaluer si le vecteur est un vecteur nul.La somme des éléments de la liste peut être égale à 0 sans qu'ils soient forcément tous 0 Exemple avec :P1 (0 0 0)P2 (-1 0 -1)P3 (1 1 0)P4 (1 2 0)le produit vectoriel donne (1 0 -1) et l'expression retourne T alors que les droites sont perpendiculaires. Bonuscad,Le lien est très intéressant, on y trouve la méthode donnée par Didier avec le produit vectoriel et aussi une autre qui teste la "coplanéarité" de 4 points en utilsant astucieusement produit vectoriel et produit scalaire.J'y ai découvert qu'on pouvait calculer la surface d'un triangle avec le produit vectoriel. Lovecraft,Je persiste à dire que ton approche est très intéressante en ce sens qu'elle dispense d'étudier les projections des droites sur les 3 plans de référence.Tu n'est pas loin de l'aboutir, si tu as du mal, demande moi, je t'aiderais. Quant à la piste lancée par lecrabe (l'équation de la droite du plan y = Ax + B), elle s'avère encore plus laborieuse que celle qui consistait à comparer les angles des projections sur les plans de référence.Cela nécessite d'évaluer d'abord si les droites ne sont pas ce qu'on appelle en géométrie descriptive des droites particulières (perpendiculaires ou parallèles à un des plans de référence), parceque les coordonnées des points définissant ces droites entraineraient une division par 0 dans le calcul de la "pente" sur chacun des plans de référence. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
Didier-AD Posté(e) le 22 mai 2007 Posté(e) le 22 mai 2007 Didier,Je pense que l'expression (equal (apply '+ (pvectoriel (mapcar '- P2 P1) (mapcar '- P3 P4))) 0 1e-9), fort élégante au demeurant, n'est pas fiable pour évaluer si le vecteur est un vecteur nul.La somme des éléments de la liste peut être égale à 0 sans qu'ils soient forcément tous 0 Exemple avec :P1 (0 0 0)P2 (-1 0 -1)P3 (1 1 0)P4 (1 2 0)le produit vectoriel donne (1 0 -1) et l'expression retourne T alors que les droites sont perpendiculaires. Ben voilà, quand on veut aller trop vite. Désolé !il faut remplacer par (apply 'AND (mapcar '(lambda (c) (equal c 0.0 1e-9)) (pvectoriel (mapcar '- P2 P1) (mapcar '- P3 P4))))
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