2.2.4.1.2. Nuevas Funciones Trigonométricas

Las funciones trigonométricas que ofrece AutoLISP como primitivas sereducen a tres: SENO, COSENO y ARCOTANGENTE. Muchas operacionesgeométricas requerirán, sin embargo, recurrir a otros operadorestrigonométricos. Esto puede servir de ejemplo a la posibilidad dedesarrollar 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 suministrasolamente num1. Si se suministraran ambos argumentos num1 y num2, ATAN devuelve el arcotangente de num1/num2, enradianes. Si num2 fuera cero, devolverá un ángulo demás o menos 1.570796 radianes (+90 grados° o –90grados°), 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 pordefecto en ángulos sexagesimales, sería necesario tener a manosiempre 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 JonFleming.

Autor: Jon Fleming <jonf@fleming-group.com>, Mayo 201997.
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 unrango de -9.7E307+epsilon a 9.7E307, ambos inclusive. Se analiza la posibilidadde que el coseno del valor pasado sea igual a cero, para evitar un error dedivisió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 losrangos de -9.7E307+epsilon a -1.0, ambos inclusive y de 1.0 a 9.7E307, ambosinclusive
(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 losrangos de -9.7E307+epsilon a -1.0, ambos inclusive y de 1.0 a 9.7E307, ambosinclusive
(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 ambosinclusive o 1 a infinito, ambos inclusive, y devuelve un ángulo enradianes en el rango de pi a 0, ambos inclusive (excepto EXACTAMENTE pi/2 quenunca será devuelto en un ordenador con precisión numéricafinita)
(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, ambosinclusive o 1 a infinito, ambos inclusive, y devuelve un ángulo enradians en el rango -pi/2 a pi/2, ambos inclusive (excepto EXACTAMENTE 0.0 quenunca será devuelto en un ordenador con precisión numéricafinita)
(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