Las funciones trigonométricas que ofrece AutoLISP como primitivas se
reducen a tres: SENO, COSENO y ARCOTANGENTE. Muchas operaciones
geométricas requerirán, sin embargo, recurrir a otros operadores
trigonométricos. Esto puede servir de ejemplo a la posibilidad de
desarrollar nuevas funciones utilitaria dentro de LISP.
Funciones Trigonométricas primitivas de AutoLISP:
- SIN
(sin ang)
- Devuelve el seno de un ángulo expresado en radianes.
- COS
(cos ang)
- Devuelve el coseno de un ángulo expresado en
radianes.
- ATAN
(atan num1 [num2])
- Devuelve el arcotangente de num1, en radianes, si se le suministra
solamente num1. Si se suministraran ambos argumentos num1 y
num2, ATAN devuelve el arcotangente de num1/num2, en
radianes. Si num2 fuera cero, devolverá un ángulo de
más o menos 1.570796 radianes (+90 grados° o –90
grados°), según el signo de num1. El rango de
ángulos devuelto es -pi/2 a +pi/2 radianes.
Funciones de conversión:
Puesto que AutoLISP trabaja con radianes mientras que AutoCAD lo hace por
defecto en ángulos sexagesimales, sería necesario tener a mano
siempre las funciones de conversión grados-radianes.
Conversión entre grados y redianes:
;;;recibe ang en radianes y lo devuelve en grados
(defun grados (rad)
(* (/ rad pi) 180.0)
);_fin de defun
;;;recibe ang en grados y lo devuelve en radianes
(defun radianes (grd)
(* (/ grd 180.0) pi)
);_fin de defun
Las funciones trigonométricas no incluidas con AutoLISP:
Las siguientes funciones trigonométricas han sido publicadas por Jon
Fleming.
Autor: Jon Fleming <jonf@fleming-group.com>, Mayo 20
1997.
fuente: Grupo de Noticias autodesk.autocad.customization
Obsérvese que:
- Algunas de las funciones (ASEC -arcosecante- y ACSC
-arcocosecante-) utilizan otras funciones definidas en este mismo archivo.
- Ninguna de estas funciones comprueban la validez de
los argumentos que reciben. Esta comprobación debe hacerse en los programas
que las invocan.
- Las funciones se han desarrollado evitando la
posibilidad de un error de división por cero.
- Se ha determinado experimentalmente que 9.7E307 es el
número mayor que puede ser generado en AutoLISP (R14).
- Visual LISP en Autocad 2000 (R15) y 2002 al producirse un número en exceso del mayor valor
real admitido, en lugar de generar un error devuelve el símbolo 1.#INF, que
puede asignarse a una variable que sea devuelta en caso de división por
cero:
Podemos definir una función que nos devuelva este símbolo. Para ello
contamos con el predicado no documentado VL-INFP que detecta cuando un
número rebasa el máximo valor admitido para los números reales:
(defun infinito ( )
(setq *INF* 2.0)
(while (not (VL-INFP *INF*))
(setq *MAX-REAL* *INF* *INF* (expt *INF* 2))))
_$ (infinito)
1.#INF
_$ *MAX-REAL*
1.34078e+154
_$ *inf*
1.#INF
así tendremos que cualquier número dividido entre *INF* devolverá
cero y tendremos definida una variable global *MAX-REAL* que nos
permitirá comprobar si un valor se aproxima al máximo valor real
admitido por el sistema:
(/ 254.98 *INF*) 0.0
- TAN
- acepta cualquier ángulo en radianes y devuelve la tangente en un
rango de -9.7E307+epsilon a 9.7E307, ambos inclusive. Se analiza la posibilidad
de que el coseno del valor pasado sea igual a cero, para evitar un error de
división por cero.
(defun tan (z / cosz)
(if (zerop (setq cosz (cos z)))
*INF*
(/ (sin z) cosz)
) ;_fin de if
) ;_fin de defun
- SEC
- Acepta cualquier ángulo en radianes, devolviendo la secante en los
rangos de -9.7E307+epsilon a -1.0, ambos inclusive y de 1.0 a 9.7E307, ambos
inclusive
(defun sec (z / cosz)
(if (zerop (setq cosz (cos z)))
*INF*
(/ 1.0 cosz)
) ;_fin de if
) ;_fin de defun
- CSC
- Acepta cualquier ángulo en radianes, devolviendo la cosecante en los
rangos de -9.7E307+epsilon a -1.0, ambos inclusive y de 1.0 a 9.7E307, ambos
inclusive
(defun csc (z / sinz)
(if (zerop (setq sinz (sin z)))
*INF*
(/ 1.0 sinz)
)
)
- ASIN (seno inverso)
- acepta un argumento en el rango -1.0 a 1.0 ambos inclusive, y devuelve un
ángulo en radianes en el rango de (-pi/2) a (pi/2) ambos inclusive.
(defun asin (z /)
(atan z (sqrt (- 1.0 (* z z))))
) ;_fin de defun
- ACOS (coseno inverso)
- acepta un argumento en el rango -1.0 a 1.0 ambos inclusive, y devuelve un
ángulo en radianes en el rango de pi a 0 ambos inclusive
(defun acos (z /)
(atan (sqrt (- 1.0 (* z z))) z)
) ;_fin de defun
- ASEC (secante inversa)
- acepta un argumento en uno de dos rangos: menos infinito a -1 ambos
inclusive o 1 a infinito, ambos inclusive, y devuelve un ángulo en
radianes en el rango de pi a 0, ambos inclusive (excepto EXACTAMENTE pi/2 que
nunca será devuelto en un ordenador con precisión numérica
finita)
(defun asec (z /)
(acos (/ 1.0 z))
) ;_fin de defun
- ACSC (cosecante inversa)
- acepta un argumento en uno de dos rangos: menos infinito a -1, ambos
inclusive o 1 a infinito, ambos inclusive, y devuelve un ángulo en
radians en el rango -pi/2 a pi/2, ambos inclusive (excepto EXACTAMENTE 0.0 que
nunca será devuelto en un ordenador con precisión numérica
finita)
(defun acsc (z /)
(asin (/ 1.0 z))
) ;_fin de defun
- ACOT (cotangente inversa)
- acepta un argumento en el rango de menos infinito a más infinito,
ambos inclusive y devuelve un ángulo en radianes en el rango de pi a 0,
ambos inclusive.
(defun acot (z /)
(- (/ pi 2.0) (atan z))
) ;_fin de defun
jrf