Aller au contenu

probleme de fonction IF


Messages recommandés

Posté(e)

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.

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

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

Posté(e)

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.

Posté(e)

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

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é