solgti Posté(e) le 20 juillet 2016 Posté(e) le 20 juillet 2016 Bonjour, j'ai un problème étrange.J'ai une liste de points que je lis pour trouver la direction de l'angle.La liste est la suivante:((1715,26 4377,56) (1715,26 5237,19) (1715,26 6096,82) (2828,1 6096,82) (3940,94 6096,82) (5053,78 6096,82) (5053,78 5237,19) (5053,78 4377,56)) La fonction: (while (cadr lt) (setq a(rtod(angle (car lt)(cadr lt)))) (setq la(append la(list a))) (setq lt(cdr lt)) )** RTOD transforme les Radian en Degré la fonction lit correctement les points:Le résultat est:(90,0 90,0 0,0 0,0 -5.08889e-014 -90.0 -90.0) Tout semble bon, mais le 5ème angle est bizarre Si vous regardez la liste, vous pouvez voir que les 3e, 4e, 5e et 6e éléments de la liste sont des points horizontaux.Mais si vous essayez de trouver l'angle:(Angle (nth 2 ls) (nth 3 ls)) Résultat: 0.0(Angle (nth 3 ls) (nth 4 ls)) Résultat: 0.0(Angle (nth 4 ls) (nth 5 ls)) Résultat: 6.28319 le dernier résultat a un mauvais impact sur le reste du programme que j'ai écrit (insertion de bloc et dessin de balustrade de balcon) Quelqu'un sait pourquoi le 3e résultat est différent du 1er et 2e? Et Pouvez-vous aider à retourner 0.0 comme 1er et 2e? Merci solgti
(gile) Posté(e) le 20 juillet 2016 Posté(e) le 20 juillet 2016 Salut, -5.08889e-014 = -0.0000000000000508889Ce qui est très (vraiment très) proche de 0.Cette (petite) imprécision est inhérente au codage des nombres réels en binaire : à part pour les nombres entier et les nombres dont on peut exprimer la partie décimale en puissance de 2 comme 0.125 (2 ^-3) pour les autres ce sera toujours une approximation (très précise mais entachée d'imprécision). Pour ne pas avoir ce genre de désagrément (si tant est que c'en est un) il faut que tu fasse un arrondi pour certaines valeurs dans ta fonction rtod. (defun rtod (a) (cond ((equal (rem a (* 2.0 PI)) 0.0 1e-12) 0.0) ((equal (rem a PI) 0.0 1e-12) 180.0) (( * a (/ 180.0 PI))) ) ) Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
(gile) Posté(e) le 20 juillet 2016 Posté(e) le 20 juillet 2016 Tu peux aussi arrondir le résultat retourné par rtod avec la fonction suivante : ;; RoundTo ;; Arrondit le nombre au nombre de décimales spécifié ;; ;; Arguments ;; n : le nombre à arrondir ;; d : le nombre de décimales (defun roundto (n d / p) (setq p (expt 10. d)) (/ (fix ((if (minusp n) - +) (* n p) 0.5)) p) ) (roundto -5.08889e-014 12) arrondit à la douzième décimale (soit au millième de milliardième) et retourne 0.0 Gilles Chanteau - gileCAD - GitHub Développements sur mesure pour AutoCAD
solgti Posté(e) le 21 juillet 2016 Auteur Posté(e) le 21 juillet 2016 Merci beaucoup pour votre aide. C'est toujours plus clair lorsque l'on parle à quelqu'un. solgti
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