juju_30 Posté(e) le 13 juillet 2010 Posté(e) le 13 juillet 2010 Bonjour, sa fait quelque temps que j'utilise le langage LISP, cependant je bloque sur un probleme basique.je compare deux ordonnées de deux points, qui sont EGALES (c'est verifié), cependant lorsque j'écris: (if (= (cadr point1) (cadr point2))(progn1...)(progn2...) je suis renvoyé au progn2 au lieu du progn1. si quelqu'un peut me dire à quoi cela peut etre dû, je le remercie d'avance.
lovecraft Posté(e) le 13 juillet 2010 Posté(e) le 13 juillet 2010 Bonjour, je viens de faire un test cela fonctionne correctement chez moi. Cependant je ne suis pas un tenor en programmation lisp. Voici ci-dessous le test que j'ai effectué: (setq point1 '(0 3) point2 '(0 3))(if (= (cadr point1) (cadr point2))(progn(alert "premier"))(progn(alert "second"))) j'espère que cela puisse t'aider. Cordialement, Laurent http://www.youtube.com/user/CADMINATOR?feature=mhee
(gile) Posté(e) le 13 juillet 2010 Posté(e) le 13 juillet 2010 Salut, Si tu es "renvoyé au progn2 au lieu du progn1" c'est que la condition (= (cadr point1) (cadr point2)) n'est pas remplie. La fonction = ne retourne T qu'en cas de stricte égalité entre tous les arguments qui lui sont passés, autrement dit, elle n'admet aucune tolérance.Or, les coordonnées dans AutoCAD sont très souvent des nombres à virgule flottante qui doivent être arrondis (à la 15 ou 16ème décimale).Ceci peut générer une imprécision infime (à la neuvième décimale le rapport est de l'ordre du micron pour un kilomètre) mais suffisante pour que la fonction = retourne nil. Il est donc préférable, pour comparer des coordonnées ou des angles, d'utiliser la fonction equal avec un une tolérance : (if (equal (cadr point1) (cadr point2) 1e-9) ...) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
juju_30 Posté(e) le 13 juillet 2010 Auteur Posté(e) le 13 juillet 2010 en definissant mes points 1 et 2 différement juste avant la fonction IF, cette derniere fonctionne correctement. ce qui me pousse encore un peu plus dans l'incompréhension car la différence entre point1 (0 3 0) ou (84965.9 31245.9 0.0)point2 (0 3 0) ou (50678.6 31245.9 0.0) je ne la vois pas, surtout qu'en on compare seulement les Y mais merci qu'en meme
(gile) Posté(e) le 13 juillet 2010 Posté(e) le 13 juillet 2010 Tout dépend de comment sont définies les coordonnées.Si elles ont été directement entrées au clavier, elles sont justes, mais si elles sont isuues d'une saisie à l'écran ou de calculs elles sont très probablement arrondies, par exemple il n'y a pas de valeur juste de pi, 3.141592653589793 est une valeur arrondie. Dans ton exemple, si tu entres au clavier (84965.9 31245.9 0.0), 31245.9 est une valeur juste, si c'est ce qu'AutoCAD affiche pour une saisie à l'écran, c'est probablement une valeur arrondie. Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
juju_30 Posté(e) le 13 juillet 2010 Auteur Posté(e) le 13 juillet 2010 les quatre premières decimales étaient bien égales mais pas les autres. du coup tout fonctionne bien.merci pour ces indications et bonne fin de journée.
(gile) Posté(e) le 13 juillet 2010 Posté(e) le 13 juillet 2010 autre exemple, soit un point p1 dont les coordonnées sont 5, 20 (entrées au clavier) et le point p2 dont les coordonnées sont calculées avec polar depuis le point 5, 10 (10 unités à 90°) ce qui théoriquement donne le même point.On note une imprécision à la 16ème décimale pour l'abscisse de p2. Séquence dans la console Visual LISP : _$ (setq p1 '(5. 20.))(5.0 20.0)_$ (setq p2 (polar '(5. 10.) (/ pi 2) 10.))(5.0 20.0)_$ (= (car p1) (car p2))nil_$ (equal (car p1) (car p2) 1e-15)T Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour 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