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).

Programar una función que dibuje una 3DMalla (3DMesh) recibiendo como argumentos el valor de la resolución (

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
calculopara obtener la lista de coordenadas para todos los vértices. - Invoque la función
dib-mallaque 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.








