Aller au contenu

Messages recommandés

Posté(e)

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

Posté(e)

Salut,

 

-5.08889e-014 = -0.0000000000000508889

Ce 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

Posté(e)

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

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é