El programa de dibujo en 3D que proponemos tiene la capacidad de crear diversas superficies a partir de fórmulas matemáticas que dan el valor de la coordenada Z a partir de los valores de las coordenadas X e Y. Las Figuras 1, 2 3 y 4 muestran los resultados de cuatro fórmulas diferentes con distintos valores de resolución (número de valores calculados para filas y columnas).
1. Fórmulas.
Para ello se programarán cuatro funciones con los nombresf1
, f2
, f3
y f4
que reciban los valores de x
e y
, y devuelvan el valor de z
correspondiente a cada una de las cuatro fórmulas que se muestran en la Figura anterior.Función f1:
(defun f1 (x y /)
(cos (sqrt (+ (* x x 2) (* y y)))))
(defun f2 (x y / )
(sqrt (abs(* x y))))
( defun f3 (x y / )
(* x y))
(defun f4 (x y / )
(exp (- (+ (* x x) (* y y)))))
2. Función de CÁLCULO:
Programar una función de nombre
calculo
que reciba como argumentos:Variable: | Descripción: |
formula | Valor devuelto por op-funcion (ver Apartado 3). |
Xmin | Valor inicial de X (calculado en la función datos desarrollada en el Apartado 2). |
Ymin | Valor inicial de Y (calculado en la función datos desarrollada en el Apartado 2). |
pasoX | Incremento de X (calculado en la función datos desarrollada en el Apartado 2). |
pasoY | Incremento de Y (calculado en la función datos desarrollada en el Apartado 2). |
res | Número de valores a calcular para las dimensiones X e Y (ver Apartado 2). |
origen | Punto que indica la posición del centro de la malla (ver Apartado 2). |
A partir de estos datos se deberá:
- Calcular los valores de Z para cada punto (Xi,j Yi,j)
- Incrementar el valor de Xi,j e Yi,j de cada punto por los valores Xo e Yo de origen
- acumule en una lista los valores XYZ resultantes para cada punto ((X0,0 Y0,0) (X0,1 Y0,1) (X0,2 Y0,3)… (Xi,j Yi,j))
Ejemplo:
se obtiene la lista que se muestra a la derecha y que corresponde al modelo que muestra la Figura 5. Figura 5. modelo con valores de coordenadas. |
(-1.0 -0.6 0.256661) (-1.0 -0.2 0.353455) (-1.0 0.2 0.353455) (-1.0 0.6 0.256661) (-0.6 -1.0 0.256661) (-0.6 -0.6 0.486752) (-0.6 -0.2 0.67032) (-0.6 0.2 0.67032) (-0.6 0.6 0.486752) (-0.2 -1.0 0.353455) (-0.2 -0.6 0.67032) (-0.2 -0.2 0.923116) (-0.2 0.2 0.923116) (-0.2 0.6 0.67032) (0.2 -1.0 0.353455) (0.2 -0.6 0.67032) (0.2 -0.2 0.923116) (0.2 0.2 0.923116) (0.2 0.6 0.67032) (0.6 -1.0 0.256661) (0.6 -0.6 0.486752) (0.6 -0.2 0.67032) (0.6 0.2 0.67032) (0.6 0.6 0.486752)) |
La función calculo
devolverá la lista devalores XYZ en su orden correcto.
(defun calculo (formula Xmin Ymin pasoX pasoY res origen / lst)
(setq i 0)
(while (< i res)
(setq j 0
y Ymin)
(while (< j res)
(setq lst (cons (list (+ Xmin (nth 0 origen))
(+ y (nth 1 origen))
(apply formula (list Xmin y)))
lst))
(setq j (1+ j)
y (+ y pasoY)))
(setq i (1+ i)
Xmin (+ Xmin pasoX)))
(reverse lst))
3. Solicitud de los Valores de Entrada:
Programar una función de nombre
datos
que haga al usuario las siguientes preguntas:Mensaje: | Descripción: |
Tipo de Superficie [1/2/3/4]: | El usuario tendrá la posibilidad de escoger entre las opciones 1, 2 3 o 4, no permitiéndose otras. El valor seleccionado por el usuario se guardará en una variable de cadena de nombre opcion. |
Dimensión en X: | El usuario podrá introducir un número real que se guardará en la variable dimX. |
Dimensión en Y: | El usuario podrá introducir un número real que se guardará en la variable dimY. |
Resolución de la malla: | El usuario podrá introducir un número entero de valor entre 2 y 256 que se guardará en la variable res. |
Centro de la malla: | El usuario podrá seleccionar un punto o teclear sus coordenadas. Este valor se guardará en la variable origen. |
El programa debe impedir que el usuario introduzca valores no numéricos en el caso de valores para dimX, dimY o res. En el caso de res se debe impedir que los valores sean menores que 2 o mayores de 256.
A partir de los datos aportados por el usuario se realizarán los siguientes cálculos cuyo resultado se asignará a las variables que se indican a la izquierda:
Todas las variables creadas por la función datos serán de carácter global, es decir que estarán disponibles para cualquier otra función dentro del programa.
(defun datos (/)
(initget 1 "1 2 3 4")
(setq opcion (getkword "\nTipo de Superficie [1/2/3/4]: ")
dimX (getreal "\nDimensión en X: ")
dimY (getreal "\nDimensión en Y: ")
res (getint "\nResolución de la malla: "))
(while (not (< 1 res 257))
(prompt "\nEl valor de resolución debe estar entre 2 y 256")
(setq res (getint "\nResolución de la malla: ")))
(setq origen (getpoint "\nCentro de la malla: ")
pasoX (/ dimX res)
pasoY (/ dimY res)
Xmin (- (/ dimX 2))
Ymin (- (/ dimY 2))))
Programar una función de nombre op-funcion que reciba como argumento el valor asignado a la variable opcion en la pregunta anterior y devuelva una función (dentro de quote). Los valores que serán devueltos son:
Opción: | Función Devuelta |
"1" | F1 |
"2" | F2 |
"3" | F3 |
"4" | F4 |
(defun op-formula (opcion /)
(cond ((= opcion "1") 'f1)
((= opcion "2") 'f2)
((= opcion "3") 'f3)
((= opcion "4") 'f4)))
5. Dibujo de la Malla 3D:
Programar una función que dibuje una 3DMalla (3DMesh) recibiendo como argumentos el valor de la resolución (
res
) y la lista de coordenadas de los vértices de la malla resultante de la función calculo
. Una 3DMALLA se define a partir de una matriz cuyo tamaño viene determinado por los valores M y N. El producto de M por N equivale al número de vértices que el usuario debe especificar.La ejecución de este comando sigue la siguiente secuencia:
Comando: 3dmalla
Indique tamaño de la malla en la dirección M: (un valor entre 2 y 256)
Indique tamaño de la malla en la dirección N: (un valor entre 2 y 256)
Indique la situación del vértice (0, 0): (un valor de punto con coordenadas XYZ)
… y así sucesivamente para cada vértice (i, j)
La situación de cada vértice de la malla se define a partir de los índices
i
, j
, los índices de fila y columna del vértice. Se deben suministrar todos los valores para la fila i
antes de especificar los de la fila i+1
. La distancia entre vértices puede ser variable y la orientación de la malla depende de la ubicación de los vértices.(defun dib-malla (res lista-coordenadas / )
(command "_3dmesh" res res)
(foreach pto lista-coordenadas (command pto)))
Programar una función principal de nombre C:MALLA que opere como un comando de AutoCAD en que:
- Desactive las referencias a objeto al inicio del programa y las restaure al final del mismo.
- Invoque la función
datos
(desarrollada en el Apartado 2) para solicitar al usuario la información necesaria para la ejecución del programa. - Invoque la función
calculo
para obtener la lista de coordenadas para todos los vértices. - Invoque la función
dib-malla
que crea el modelo de superficie. - Anule todas las variables globales creadas por la función
datos
(de la Pregunta 2). Al terminar el programa sus valores serán todosnil
.
(defun c:malla (/ dimX dimY res origen pasoX pasoY Xmin Ymin lista-coordenadas)
(setq modoant (getvar "osmode"))
(setvar "osmode" 0)
(datos)
(setq lista-coordenadas
(calculo (op-formula opcion)
Xmin
Ymin
pasoX
pasoY
res
origen))
(dib-malla res lista-coordenadas)
(setvar "osmode" modoant))
Ejercicio de examen propuesto el 22 de julio de 2007. Está basado en el programa FPLOT, diseñado e implementado por Kelvin R. Throop en junio de 1988.