Академический Документы
Профессиональный Документы
Культура Документы
INTRODUCCION.................................................................................................................. 10
APUNTES DE LA HISTORIA................................................................................................... 11
APLICACIONES..................................................................................................................... 15
Entretenimiento.......................................................................................................................15
Diseño asistido por computador..............................................................................................16
Visualización cientifíca y médica..............................................................................................18
Simulación y entrenamiento....................................................................................................19
Gráficos de presentación.........................................................................................................20
Creaciones artísticas.................................................................................................................21
TECNOLOGÍAS DE SALIDA.................................................................................................... 22
Tecnología de Salida: Vectorial.................................................................................................22
Tecnología de Salida: Raster-Scan............................................................................................24
PRIMITIVAS - RENDERING.................................................................................. 39
3
INTRODUCCIÓN.................................................................................................................. 39
PRIMITIVAS GRAFICAS......................................................................................................... 41
TRANSFORMACION EN 2D................................................................................................... 83
TRASLACION.............................................................................................................................83
ESCALAMIENTO........................................................................................................................85
ROTACION.................................................................................................................................87
COORDENADAS HOMOGENEAS........................................................................................... 89
REPRESENTACION EN COORD. HOMOGENEAS........................................................................91
COMPOSICION DE TRANSFORMACIONES.............................................................................95
4
OTRAS TRANSFORMACIONES..............................................................................................96
PROYECCIONES.................................................................................................... 121
5
Matemáticas de las Proyecciones Paralelas Oblicuas...........................................................130
Proyección CAVALLIER.......................................................................................................132
Proyección CABINET..........................................................................................................132
APROXIMACIONES............................................................................................................ 138
PROGRAMACION EN AUTOLISP......................................................................155
ESTRUCTURAS DE PROGRAMAS.-.......................................................................................164
8
9
INTRODUCCION A GRAFICAS POR
COMPUTADORA
OBJETIVOS
El estudiante será capaz de distinguir las características de los dispositivos de salida
Vectoriales y Raster.
CONTENIDO
INTRODUCCION
APUNTES DE LA HISTORIA
APLICACIONES
TECNOLOGÍAS DE SALIDA
EL PROCESO DE OBTENCIÓN DE IMÁGENES
INTRODUCCION
Lo que se verá en la materia:
10
APUNTES DE LA HISTORIA
1944: Computador Whirlwind (MIT)
o Uso de transistores
o Terminal de Video
o Lápiz de Luz
13
1970: “Casco virtual”
1º dispositivo de su género
Ivan Sutherland
1º video-game computarizado
14
Versión comercial
APLICACIONES
Entretenimiento
– Áreas
o Cine: (Tron. Toy Story, etc)
o Televisión (Cortinillas, cabeceras, etc)
15
o Juegos por computador
– Técnicas
o Animación
o Rendering
o Efectos especiales (ej. morphing)
o Interactividad
16
– CAD: Conjunto de herramientas gráficas que permiten diseñar prototipos y
evaluarlos antes de ser construidos.
– Áreas importantes:
o Diseño mecánico
o Arquitectura
o Circuitería eléctrica
o Circuitos impresos e integrados
– Otras posibilidades:
o Animaciones interactivas
o Sistemas multivista
o Presentación final realista
o Sugerencias constructivas
o Análisis del diseño con métodos de ingeniería u Conexión con el
sistema de fabricación (CAM)
17
Visualización cientifíca y médica
– Áreas:
o Medicina (Ej. Resonancias)
o Ingeniería (Ej. Esfuerzos en mecanismos)
o Física (Ej. Campos)
o Química (Ej. Interacción molecular)
o Matemáticas (Ej. Solución a ecuaciones)
o Topografía y oceanografía (Ej. Terrenos y corrientes)
18
– Técnicas:
o Codificación por color
o Curvas de nivel
o Visualización de volúmenes
o Generación de terrenos fractal
Simulación y entrenamiento
– Áreas:
o Simulación de conducción
o Simulación de procesos
o Entrenamiento
o Enseñanza
19
– Técnicas:
o Tiempo real
o Interactividad
– Equipamiento:
o Generalmente se necesita un equipamiento específico para simular el
objeto de entrenamiento (Ej. Simuladores de vuelo)
Gráficos de presentación
20
– Áreas de mayor uso:
o Economía
o Estadística
o Matemáticas
o Administración y gestión
– Técnicas principales:
o Gráficos de línea
o Gráficos de barra
o Gráficos de tarta
o Superficies 3D
Creaciones artísticas
– Técnicas y software:
o Programas tipo “paintbrush”
o Programas de soporte a la animación
21
o Técnicas de tratamiento de imagen
o Técnicas de “rendering”
TECNOLOGÍAS DE SALIDA
Tecnología de Salida: Vectorial
22
El haz de electrones se mueve de acuerdo a comandos, de un punto a cualquier otro
23
Impacto del haz sobre el fósforo de la pantalla genera luz (no persistente)
Requiere refrescamiento
24
• La deflexión hace apuntar el rayo a un punto de la pantalla.
25
• No hay división de líneas impares y pares
• Monitor monocroma
o Usa un tipo de fósforo
• Monitor color
o Usa 3 distintos fósforos en pantalla
o Composición de un pixel en color: tríada o stripe (tiras)
26
EL PROCESO DE OBTENCIÓN DE IMÁGENES
27
• En general, se considera disponible:
o Una descripción geométrica 3D de los objetos
o Una descripción física asociada a los objetos
o Un observador de la escena (conjunto de objetos)
o Unas condiciones de iluminación
o Un dispositivo físico de representación
o Un objetivo a cumplir (realismo, rapidez, codificación por colores, etc.)
• Técnicas implicadas:
28
o Modelado geométrico de superficies
o Modelado de sólidos
o Otros modelos (datos científicos, fractales, gramáticas, etc)
o Arquitecturas jerárquicas
o Algoritmos de recorrido e interrogación de estructuras de datos
• Técnicas implicadas:
o Espacio afín (vectores y puntos)
o Transformaciones afines (traslación, giro y escalado)
o Matrices de transformación
29
• Técnicas implicadas:
o Modelado de la vista (cámara sintética, volumen de la vista, etc)
o Transformaciones afines
o Matrices de transformación
P.O.I. Recortado
• El observador tiene un campo de visión determinado por el volumen de la
vista. Lo que queda fuera del campo de visión debe ser eliminado de las
posteriores operaciones: proceso de recortado.
• En general, el recortado calcula la parte común entre dos entidades
geométricas. En este caso, una de ellas es el volumen de la vista; la otra cada
uno de los objetos.
• Técnicas implicadas:
o Cálculo de intersecciones
o Criterios de interioridad
o Concavidad y convexidad
o Algoritmos de recortado de rectas
o Algoritmos de recortado de polígonos
P.O.I. Proyección
• La representación en el dispositivo es en 2D, la escena está en 3D.
31
• Tipos de proyección:
o Paralela: visuales paralelas
o Perspectiva: visuales partiendo del observador (pto. de vista)
• Técnicas implicadas:
o Sistemas proyectivos
o Matrices de proyección
o Transformación perspectiva-paralela
32
P.O.I. Conversión al Raster
• Actualmente la representación de gráficos en un computador se realiza
activando puntos discretos de una matriz: el raster.
P.O.I. Iluminación
• Conocidos los puntos que representan sobre el raster cada primitiva es
necesario conocer el color que se debe asignar a cada punto.
• El color depende de:
o Las condiciones de iluminación del punto 3D sobre la superficie del
objeto con el que se corresponde.
o La forma (normal) de ese objeto en ese punto.
33
o Las propiedades ópticas del material que está hecho.
o El acabado superficial (rugosidad).
o El color del objeto (del material o de la pintura).
– El modelo se construye:
o A partir de una imagen real (adquisición)
o A partir de una idea (editor)
34
• Todas las operaciones descritas se programan por medio de librerías gráficas
(OpenGl, StarBase, etc.)
35
36
TEMA 2
37
38
PRIMITIVAS - RENDERING
OBJETIVOS
El estudiante será capaz de comprender los diferentes métodos de discretización.
CONTENIDO
INTRODUCCIÓN
PRIMITIVAS GRAFICAS
ESPECIFICACIÓN DE UNA DISCRETIZACION
DIBUJO DE LÍNEAS RECTAS
ALGORITMOS BASICOS PARA CIRCULOS
ALGORITMOS PARA ELIPSES
INTRODUCCIÓN
En los sistemas raster, las imágenes vienen definidas por la intensidad de sus
pixels.
39
Los objetos presentes en la imagen se componen de primitivas simples (líneas,
puntos)
El sistema gráfico dibuja estas primitivas transformándolos en pixels ->
Rasterización
Los métodos de conversión deben ser lo más eficientes posible
40
o Se coloca la intensidad deseada en la celda de memoria del frame
buffer correspondiente
o Cuando el haz de electrones pase por esa línea horizontal (scan-line),
emitirá al pasar por esa posición
PRIMITIVAS GRAFICAS
Es muy difícil escoger un conjunto de primitivas graficas que sea adecuado
para la presentación de todo tipo de entidades graficas. Sin embargo, el
siguiente subconjunto en la práctica resulta suficiente:
o Puntos.- Se especifican a partir de su localización y color.
41
o Segmentos de recta.- Son esenciales para la mayor parte de las
entidades. Se especifican a partir de un par de puntos que
representan sus extremos.
o Circunferencias.- En algunos casos representar entidades curvadas con
segmentos poligonales puede ser inadecuado o costoso, por lo que en
la práctica las circunferencias o círculos se adoptan como primitivas.
Se especifican con la posición de su centro y su radio.
o Polígonos.- Son indispensables para representar entidades sólidas. Se
representan a partir de una secuencia de puntos que determina la
poligonal de su perímetro.
42
Sin embargo, las posiciones de los pixels son valores enteros, y los puntos
obtenidos de la ecuación son reales -> existe un error (aliasing)
A menor resolución, mayor es el efecto
Hay que calcular las coordenadas de los pixels que estén lo más cerca posible
de una línea recta ideal, infinitamente delgada, superpuesta sobre la matriz de
pixels.
Las consideraciones que un buen algoritmo debe cumplir son:
o La secuencia de pixels debe ser lo más recta posible
o Las líneas deben dibujarse con el mismo grosor e intensidad
independientemente de su inclinación
o Las líneas deben dibujarse lo más rápido posible
43
• La ecuación de una recta es y = mx + b
o m es la pendiente
o b es el corte con el eje y
Dibuja una línea, usando la ecuación de la recta, solo para pendientes m<=1
44
float b= y0-m*x0;
if(dx<0) dx=-1 else dx=1;
while(x0 != x1)
{
x0 +=dx;
y0=ceil(m*x0+b);
putpixel(x0,y0,BLUE);
}
}
Algoritmo DDA
46
dx = x1-x0
dy = y1- y0
m =(float) dy/dx
y = y0
Para x=x0 hasta x1 hacer
Pintar Pixel(x,y)
x=x+1
y=y+m
Fin para
fin
• Solución:
Intercambiamos las variables x e y,
47
sabemos que:
xi = (1/m) (yi – b)
Entonces hallamos el siguiente valor:
xi+1 = (1/m)( yi+1 – b)
Reemplazando yi+1 =yi +Δy se tiene
xi+1 = (1/m) (yi +Δy– b)
Multiplicando y reemplazando:
xi+1 = (1/m) (yi – b) + Δy/m
xi+1 = xi + Δy/m
Como Δy=1, llegamos a la fórmula final
xi+1 = xi + 1/m
m >1, los pasos no son en x. Para manejar esto, cambiar ‘x’ por ‘y’.
48
Algoritmo DDA para pendientes m<=1
• Inconvenientes:
o Existen errores de acumulación
o El redondeo es muy lento
49
Dibuja un línea de punto a otro usando el Algoritmo DDA
ALGORITMO DE BRESENHAM
• Supongamos el caso 0 < m < 1 hay que decidir qué pixel dibujamos a
continuación, y
50
• El algoritmo debe decidir cuál de los dos pintar
• Partamos del pixel (xk, yk), y hay que decidir entre el pixel (x k+1, yk) o (xk+1,
yk+1)
d2 = (yk+1-y) = yk + 1 – m (xk + 1) - b
d1 = y – yk = m (xk + 1) + b -yk
• La diferencia entre ambas constantes nos ayudará a decidir qué pixel pintar
51
d1 – d2 = 2m (xk + 1) +2 b – yk –yk -1
d1 – d2 = 2m (xk + 1) – 2yk + 2b – 1
pk = 2 Δy xk - 2 Δx yk + 2 Δy + 2 b Δx - Δx
pk = 2 Δy xk - 2 Δx yk + c
donde C = 2 Δy + Δx (2b – 1)
• Como Δx > 0, el signo de pk coincide con el de la diferencia (d1 – d2), y por tanto:
Si pk > 0 d1 > d2
hay que pintar el pixel (xk+1, yk+1)
Si pk < 0 d1 < d2
hay que pintar el pixel (xk+1, yk)
52
• La gran ventaja es que puede calcularse pk+1 a partir del anterior
pk = 2 Δy xk - 2 Δx yk + c
Donde el termino (yk+1 – yk) es 0 o 1, dependiendo del signo del parámetro pk.
Si pk > 0 d1 > d2
53
hay que pintar el pixel (xk+1, yk+1)
pk+1 = pk + 2 Δy – 2 Δx
Si pk < 0 d1 < d2
hay que pintar el pixel (xk+1, yk)
encontes yk+1 = yk
pk+1 = pk + 2 Δy
54
pk = Δx (2 (Δy / Δx) (xk + 1) - 2 yk + 2 b - 1)
p0 = 2 Δy x0 + 2 Δy - 2 Δx y0 + 2 Δx y0 - 2 Δy x0 - Δx
p0 = 2 Δy - Δx
55
Dibuja un línea de un punto a otro usando el Algoritmo Bresenham
56
if(dx>dy){
p = 2*dy - dx;
incE = 2*dy;
incNE = 2*(dy-dx);
while (x != x1){
x = x + stepx;
if (p < 0){
p = p + incE;
}
else {
y = y + stepy;
p = p + incNE;
}
putpixel( x, y,BLUE);
}
}
else{
p = 2*dx - dy;
incE = 2*dx;
incNE = 2*(dx-dy);
while (y != y1){
y = y + stepy;
if (p < 0){
p = p + incE;
}
else {
x = x + stepx;
p = p + incNE;
}
putpixel( x, y,BLUE);
}
}
}
• Bresenham, J.E. "Algorithm for Computer Control of a Digital Plotter". IBM Systems
Journal, 4(1), 1965, 25-30.
o Usa aritmética entera
o Supone la pendiente (m) en el rango [0, 1]
57
o Parte del punto inferior-izquierdo al punto superior-derecho
58
• Si y + e + m >= y + 0.5 entonces se dibuja (x+1, y+1)
o Para (x+1, y+1), el nuevo valor de ‘e’ será:
o e = (y + e + m) – (y +1)
o e = e + m -1
incio
e = 0
y = y1
para x = x1 hasta x2
setPixel(x, y)
si e + m < 0.5
e = e + m
sino
59
y = y + 1
e = e + m –1
fin si
fin para
fin
• y sustituyendo e * dx por e’ :
e’ e’ + dy
e’ e’ + dy - dx
inicio
e’ = 0
y = y1
para x = x1 hasta x2
setPixel(x, y)
si 2(e’ + dy) < dx
e’ = e’ + dy
sino
60
y = y + 1
e’ = e’ + dy –dx
fin si
fin para
fin
61
incNE = (dx-dy);
while (y != y1){
y = y + stepy;
if (2*(p+dx) < dy){
p = p + incE;
}
else {
x = x + stepx;
p = p + incNE;
}
putpixel( x, y,BLUE);
}
}
}
(x - xc)2 + (y - yc) 2 = r2
• Círculo en el origen: X 2 + Y 2 = R 2
62
• Se podría calcular para los puntos de una circunferencia a lo largo del eje x en
pasos unitarios los valores correspondientes de y en cada posición como:
• METODO INEFICIENTE
o Se resuelve sólo 1/4 de círculo (SIMETRIA!!)
o X se incrementa en 1 por cada paso
o Y se obtiene de la ecuación del círculo:
63
o Operaciones en Punto Flotante implicadas!!
o Contorno con brechas (X cercano a R)
o Dibujo de la circunferencia con huecos
for (x=-r;x<=r;x++)
{
y=sqrt(r*r-x*x);
Form1->Canvas->Pixels[x+xc][+y+yc]=clRed;
Form1->Canvas->Pixels[x+xc][-y+yc]=clRed;
}
}
COORDENADAS POLARES
for (ang=0;ang<=360;ang+=1.0/r)
{
x=r*cos(ang*3.141516/180);
y=r*sin(ang*3.141516/180);
Form1->Canvas->Pixels[x+xc][+y+yc]=clRed;
}
}
SIMETRÍA DE 8 LADOS
65
Consideración para ahorrar cálculos:
o Aprovechar las simetrías de la circunferencia. Por cada punto hallado se
pueden ubicar siete más.
o En este caso la circunferencia está centrada en el origen, pero si no fuera
así, basta con restarle a (x,y) las coordenadas del centro de la
circunferencia, aplicar las simetrías y a los siete puntos sumarles las
coordenadas del centro nuevamente.
Dado un punto de la Circunferencia, se pinta los 7 restantes por Simetria de los 8 lados
SIMETRIA_8_LADOS(xc,yc,X,Y:integer);
INICIO
Pintar_Pixel ( X+xc, Y+yc);
Pintar_Pixel ( Y+xc, X+yc);
Pintar_Pixel ( Y+xc,-X+yc);
Pintar_Pixel ( X+xc,-Y+yc);
Pintar_Pixel (-X+xc,-Y+yc);
Pintar_Pixel (-Y+xc,-X+yc);
Pintar_Pixel (-Y+xc, X+yc);
Pintar_Pixel (-X+xc, Y+yc);
FIN
66
El valor de x que se requiere para obtener el círculo completo es desde 0 hasta
llegar a y.
Programa en C++ Builder cono Coordenadas Cartesianas usando simetría de los 8 lados
Form1->Canvas->Pixels[ y+xc][+x+yc]=clRed;
Form1->Canvas->Pixels[ y+xc][-x+yc]=clRed;
Form1->Canvas->Pixels[-y+xc][+x+yc]=clRed;
Form1->Canvas->Pixels[-y+xc][-x+yc]=clRed;
}
void circulo_cartesiano(int xc, int yc, int r)
{
float x,y;
y=r;
for (x=0;x<=y;x++)
{
y=sqrt(r*r-x*x);
simetria(xc,yc,x,y);
}
}
Programa en C++ Builder con Coordenadas Polares usando simetría de los 8 lados
for (ang=0;ang<=45;ang+=1.0/r)
{
x=r*cos(ang*3.141516/180);
y=r*sin(ang*3.141516/180);
simetria(xc,yc,x,y);
}
}
68
Hay que determinar el píxel más cercano a la circunferencia
Consideremos el centro del círculo en (0,0)
Este test lo ejecutaremos en los puntos medios entre los píxel que hay que
decidir
Mecanismo de elección del píxel a pintar:
Uso de P (referencia)
o Si P esta dentro del circulo, Píxel a la derecha
69
o Si P esta fuera del circulo, Píxel a la derecha y abajo.
Coordenadas de P ??
La gran ventaja es que puede calcularse pk+1 a partir del anterior pk. En el paso k + 1, el
parámetro de decisión se evalúa con base en la ecuación anterior como
Reordenando obtenemos
pk+1 = pk + 2xk+1 + 1
pk+1 = pk + 2xk+ 3
71
pk+1 = pk + 2xk+1 + 1 + (( y k–1 ) 2–yk2) – (yk–1–yk)
72
Dibuja una circunferencia con el Algoritmo del Punto Medio
73
}
Una elipse se define como el conjunto de puntos en que la suma de las
distancias desde dos posiciones fijas (focos) sea la misma para todos los
puntos.
Si las distancias de los dos focos desde cualquier punto P=(x,y) en la elipse se
representan como d1 y d2, entonces la ecuación general de una elipse puede
expresarse como
d1 + d2 = constante
74
ALGORITMO BASICO (Coordenadas Cartesianas)
Las ecuaciones de la elipse se simplifican, en gran medida, si se orientan los
ejes mayor y menor para alinearse con los ejes de las coordenadas, como se
muestra en la siguiente figura.
75
}
77
puntose(xc,yc,x,y,color);
//region 1
p=ceill( ry2 - ( rx2 * ry ) + ( 0.25 * rx2 ) );
while(px<py){
x++;
px+=twory2;
if( p < 0 ) p += ry2 + px;
else{ y--;
py-= tworx2 ;
p += ry2 + px - py;
}
puntose(xc,yc,x,y,color);
}
//region 2
p = ceill(ry2 * ( x+.5 ) * ( x+.5 ) + rx2
* ( y-1 ) * ( y-1 ) - rx2 * ry2);
while(y>0){
y--;
py-= tworx2 ;
if(p>0) p+= rx2-py ;
else{ x++;
px+= twory2;
p+= rx2-py+px;
}
puntose(xc,yc,x,y,color);
}
}
void puntose(int xc,int yc,int x,int y, int c){
putpixel(xc+x,yc+y,c);
putpixel(xc-x,yc+y,c);
putpixel(xc+x,yc-y,c);
putpixel(xc-x,yc-y,c);
}
78
79
TEMA 3
80
81
TRANSFORMACIONES GEOMETRICAS EN 2-D
OBJETIVOS
El estudiante será capaz usar los diferentes algoritmos para la representación de
gráficas en 2D.
CONTENIDO
QUE ES UNA TRANSFORMACION?
COORDENADAS HOMOGENEAS
COMPOSICION DE TRANSFORMACIONES
OTRAS TRANSFORMACIONES
TRANSFORMACIÓN VENTANA-ÁREA DE VISTA
82
C++ Builder, se hará uso de una vector para almacenar los datos de la imagen.
TRANSFORMACION EN 2D
TRASLACION
83
Considere la flecha abajo. Podemos desear moverla desde la posición A a la
posición B.
84
X’ = Tx + X
Y’ = Ty + Y
P’ = T + P
ESCALAMIENTO
85
Los puntos se pueden escalar por sx a lo largo del eje x y por sy a lo largo del eje y
los nuevos puntos por las multiplicaciones:
Podemos especificar más grande o más pequeño por medio de un “factor de
posicionamiento”
Para doblar el tamaño de un objeto utilizamos un factor de posicionamiento de 2,
a la mitad del tamaño de un objeto que utilizamos un factor de posicionamiento
de 0.5
X’ = Sx * X
Y’ = Sy * Y
P’ = S * P
86
void escalar(float dx,float dy)
{
int i;
for(i=0;i<m;i++) {
vert[i][0] *=dx;
vert[i][1] *=dy;
}
}
ROTACION
Primero repasamos la idea del sin y del cos para un ángulo dado:
l | OP | x2 y2
cos x / l
sin y / l
x l cos
y l sin
Y las formulas
87
| OP ' || OP | l
X’ = COSQ * X - SINQ * Y
Y’ = SINQ * X + COSQ * Y
88
P’ = R * P
COORDENADAS HOMOGENEAS
Las ecuaciones obtenidas
89
W: Valor distinto de cero
(X,Y,W) (X’,Y’,W’)
(TX,TY,TW), T <> 0
(X,Y,1)
90
REPRESENTACION EN COORD. HOMOGENEAS
Traslación:
Escalamiento:
Rotación:
typedef struct {
float v[3][3];
} MATRIZ;
MATRIZ identidad= {{{1,0,0},
{0,1,0},
{0,0,1} }};
91
MATRIZ mtrans=identidad;
typedef struct {
float x,y;
int dib;
} VTX;
int maxvtx=4;
VTX lista[3000]={{ 0, 0,0},
{100, 0,1},
{ 50,100,1},
{ 0, 0,1}};
void dibujar(void)
{
VTX aux;
int i;
for (i=0;i<maxvtx;i++)
{
aplica_matriz(lista[i],aux);
92
if(aux.dib==0)
Form1->Canvas->MoveTo(aux.x, aux.y);
else
Form1->Canvas->LineTo(aux.x, aux.y);
}
}
Traslación:
93
aux.v[0][2]=tx;
aux.v[1][2]=ty;
temp=mtrans;
multiplica(aux,temp,mtrans);
}
Escalamiento:
Rotación:
COMPOSICION DE TRANSFORMACIONES
Componer es aplicar sucesivamente transformaciones a una figura
La sucesión de transformaciones constituye una multiplicación de matrices
sucesivas
Propósito: mejorar eficiencia al aplicar una única transformación compuesta, en
vez de una serie de ellas.
EJEMPLO DE COMPOSICIÓN
95
Trasladar figura en -P al origen (P es pto. de referencia)
P’ = T(-x1,-y1) * P
P’’ = R(q) * P’
OTRAS TRANSFORMACIONES
Otras transformaciones que permiten llevar a cabo operaciones muy utiles, estas
son:
o Reflexiones
o Corte
Reflexiones en X y Y
96
Reflexion respecto al origen
97
Una reflexion respecto a la recta y=x, puede obtenerse en tres pasos:
o Girar un angulo de 45 grados en el sentido de las manecillas del reloj
o Una reflexion respecto al eje x
o Una rotación de 45 grados en contra del sentido del reloj
Reflexion general
Una reflexion sobre una recta arbitraria y=m*x+b, puede obtenerse en los
siguientes pasos:
98
Corte en X
El corte produce una deformación similar al deslizamiento de una capa sobre otra.
El corte en X se produce por la matriz:
Corte en Y
99
TRANSFORMACIÓN VENTANA-ÁREA DE VISTA
Dadas las primitivas de salida especificadas en coordenadas del mundo debe
especificarse como llevar dichas coordenadas a coordenadas de pantalla para que
puedan ser mostradas.
Ventana
100
Rango Máximo de
Coordenadas de la
Pantalla
Viewport
Coordenadas de la Pantalla
Dados:
- la ventana (en coordenadas del mundo)
- el viewport
Proceso:
o Trasladar la ventana a su origen
o Escalar ventana al tamaño del area de visión
o Trasladar nueva ventana a posición final
101
Pasos para transformar una ventana en coordenadas del mundo al Viewport en
coordenadas de pantalla
Trasladar al Origen
102
u max umin
0 0
1 0 u min xmax xmin 1 0 xmin
vmax vmin
0 1 vmin 0 0 0 1 ymin
ymax ymin
0 0 1 0 0 1 0 0 1
u u min v v
P ( x xmin ) max u min , ( y ymin ) max min vmin , 1
xmax xmin ymax ymin
103
Las primitivas de salida en coordenadas del mundo son recortadas en relación al
marco de la ventana. El remanente es mostrado en el viewport
104
105
TEMA 4
106
107
VISION TRIDIMENSIONAL
OBJETIVOS
El estudiante será capaz usar los diferentes algoritmos para la representación de
gráficas en 3D.
CONTENIDO
COORDENADAS HOMOGENEAS
SISTEMA DE LA MANO DERECHA
SISTEMA DE LA MANO IZQUIERDA
TRASFORMACIONES EN 3D
COMPOSICION DE TRANSFORMACIONES EN 3D
COORDENADAS HOMOGENEAS
Trata TODAS las transformaciones con operaciones de multiplicación
Usa una coordenada adicional para cada par (X,Y,Z)
108
SISTEMA DE LA MANO DERECHA
109
Dirección de rotación positiva
TRANSFORMACIONES EN 3D
TRASLACIÓN DE UN CUERPO
110
111
Modifica la matriz de trasformación para trastalar un objeto a la posición (tx,ty,tz)
ESCALACIÓN DE UN CUERPO
112
Modifica la matriz de trasformación para escalar un objeto en (sx,sy,sz)
113
ROTACION: Existen 3 casos, uno por cada eje de referencia
114
Modifica la matriz de trasformación para rotar “ang” grados en el eje x
115
aux.v[2][1]=-vsin;
aux.v[2][2]=vcos;
temp=mt;
multiplica(aux,temp,mt);
}
117
COMPOSICION DE TRANSFORMACIONES EN 3D
118
TEMA 5
119
120
PROYECCIONES
OBJETIVOS
El estudiante será capaz de representar imágenes 3D en una pantalla de 2D, usando
los diferentes algoritmos de proyección.
CONTENIDO
QUE ES UNA PROYECCION?
PROYECCIONES GEOMÉTRICAS PLANARES
CLASIFICACIÓN DE LAS PROYECCIONES
PROYECCIÓN EN PERSPECTIVA
PROYECCIÓN PARALELA
121
En gráfica, transforman puntos en un espacio 3D a puntos en un espacio 2D
122
CLASIFICACIÓN DE LAS PROYECCIONES
Clasificación Simplificada
123
Diferencia fundamental: Está en la relación del centro de proyección respecto del
plano de proyección
PROYECCIÓN EN PERSPECTIVA
Tamaño varía inversamente con la distancia, visualización más realista. No se
preserva paralelismo
Cuando la distancia entre el centro de proyección y el plano de proyección es
FINITA
Note cómo las líneas, que en el espacio de mundo son paralelas, en esta
proyección se ven convergentes
124
Matemáticas de las Proyecciones en Perspectiva
Consideraciones Previas:
o El plano de proyección se considerará normal al eje Z, en z = d
o Se usará el sistema de la mano izquierda
125
La proyección puede definirse como una matriz de 4 x 4. Esto es conveniente,
dado que la matriz resultante puede componerse de varias matrices de
transformación.
xs 1 0 0 0 x
ys 0 1 0 0 y
0 .
z 0 0 0 0 z
1 0 0 1/ d 1 1
d
126
xs
z
xs 1
d
y
s ys
0 z
z 1
1 d
d 0
1
• Note además la influencia de “z” sobre las expresiones de x p e yp: “z” ocasiona la
proyección
127
PROYECCIÓN PARALELA
Visualización menos realista, apropiada para mediciones exactas. Preserva
paralelismo
Cuando la distancia entre el centro de proyección y el plano de proyección es
INFINITA.
128
Descripción Gráfica en 3-D:
De lo anterior:
o Xp = X;
o Yp = Y;
o Zp = d
El valor original de Z se conserva para procesos de intensidad luminosa y
determinación de superficies visibles
129
Las expresiones anteriores pueden convertirse a matrices de transformación:
130
• Descripción Gráfica en 3-D:
Donde:
o Xp – X = L cos f
o Yp – Y = L sen f
o tan a = Z / L
Por lo tanto:
o L = Z/tan a = Z cot a
o Xp = X + Z cot a cos f
131
o Yp = Y + Z cot a sen f
• Opciones comunes para el ángulo f son 30º y 45º, que despliegan una vista de
combinación de las parte frontal, lateral y superior (o inferior) de un objeto.
Proyección CAVALLIER
132
Proyecta los datos “a” que se encuentran en 3 dimensiones a “b” en 2 dimensiones
Proyección CABINET
133
134
135
TEMA 6
136
137
DETERMINACIÓN DE SUPERFICIES VISIBLES
OBJETIVOS
El estudiante será capaz de determinar que superficies de una imagen son visibles
para el observador.
CONTENIDO
SUPERFICIE VISIBLE
APROXIMACIONES
ALGORITMO DE PRECISIÓN DE OBJETO
ALGORITMO DE PRECISIÓN DE IMAGEN
DIFERENCIAS PRECISIÓN DE OBJETO VS PRECISIÓN DE IMAGEN
CLASIFICACIÓN DE LOS ALGORITMOS
SUPERFICIE VISIBLE
Al dibujar todas las lineas de una imagen, no es facil determinar la cara del frente y
el de atras.
138
Tres formas de representar un objeto tridimensional: (a) se dibujan todas las
aristas; (b) se dibujan todas las aristas pero primero las más lejanas, y con líneas
segmentadas; (c) se dibujan solamente las aristas visibles
APROXIMACIONES
Algoritmo
Para cada objeto de la escena
139
Determinar que partes del objeto se ocultan
por otro objeto
por si mismo
Dibujar las partes visibles del color apropiado
Algoritmo:
140
Dado que debe comparar todos los objetos con cada pixel, este tipo de algoritmo
tiene un complejidad O(n*p)
La operación más completa corresponde a la intersección de la recta con el objeto
Algoritmo de z-buffer
141
• Muy simple de implementar:
– Por software
– Por hardware
• Requiere:
142
Luego, se recorre un segundo triángulo. Se compara esos valores con los ya
existentes. Si en el triángulo hay valores mayores que los equivalentes en el z-
buffer, entonces se ingresan dichos valores al z-buffer.
¿Considera que es práctico calcular el z de cada píxel para cada polígono? ¿Por qué
será el algoritmo elegido para ser implementado en las tarjetas gráficas?
void memoria_z
int pz; /*la z del polígono en las coord de pixel(x,y)*/
{
for (y = 0; y< YMAX; y++){
for (x = 0; x < XMAX; x++) {
esribir_pixel(x,y,valor_fondo);
escribir_Z(x,y,0);
}
}
for (cada poligono) {
for (cada pixel en la proyeccion del poligono){
pz = valor z del polig. En las coord. (x,y);
if (pz>= leer_Z(x,y)){
escribir_Z(x,y,pz);
escribir_pixel(x,y, color del polig en (x,y));
}
}
}
}
Ventajas:
143
o Simple de implementar
o No requiere ordenamiento
o Complejidad ilimitada de la escena
Desventajas
o Requiere de buffers (memoria)
o Gasta tiempo dibujando objetos ocultos
o Problemas de precisión en Z
o No maneja transparencias
Algoritmo de A-buffer
Se basa en lanzar rayos desde el observador a los objetos, que pasen por el centro
de cada píxel.
El objeto de intersección más cercana es el considerado.
144
Algoritmo
Seleccionar el centro de proyección y una ventana en el plano de vista;
For ( cada línea de rastreo en la imagen ) {
For ( cada píxel en la línea de rastreo ) {
hallar el rayo centro de proyección por el píxel;
For ( cada objeto en la escena ) {
If ( (objeto,rayo) y es el más cercano hasta ahora)
registrar intersección y nombre del objeto;
}
asignar color del píxel corresp. al del objeto más cercano;
}
}
Un pintor dibuja sus cuadros partiendo desde el fondo hasta llegar a los objetos
más próximos al observador.
145
El algoritmo del pintor utiliza este mismo razonamiento:
o Dibujar las superficies desde atrás hacia delante
Las superficies más cercanas son dibujadas sobre las superficies de fondo
Ejemplo:
Ventajas:
o Permite el manejo de transparencia
Problema:
o La determinación del orden entre los elementos
146
Árboles BSP
BSP: Binary partition algorithm
Esta técnica subdivide recursivamente los semiplanos en frontales y posteriores
La generación de un árbol BSP es un pre-proceso
Este tipo de árbol permite generar imágenes desde cualquier punto de vista
Aquí se tienen 5 objetos. Se toma uno como raíz y se subdivide el espacio en dos
(front y back). Paralelamente se genera una estructura de árbol donde se
especifican qué objetos están en qué semiespacio.
147
Luego, en uno de los semiespacios se hace la misma tarea. Se toma un elemento
raíz y se subdivide el semiespacio en dos. Paralelamente se construye la estructura
de árbol. Se continua hasta que haya un objeto por nodo.
148
Siga el algoritmo y verá que se pintan todos los polígonos en el orden correcto.
El algoritmo es de orden n, luego de hallado el árbol.
149
150
renderBSP(BSPtree *T)
BSPtree *near, *far;
if (eye on left side of T->plane)
near = T->left; far = T->right;
else
near = T->right; far = T->left;
renderBSP(far);
if (T is a leaf node)
renderObject(T)
renderBSP(near);
151
Back-face culling
Back-face culling (an object space algorithm) works on 'solid' objects which you
are looking at from the outside. That is, the polygons of the surface of the object
completely enclose the object.
152
Consider the 2 faces of a cube and their normal vectors.
Vectors N1 and N2 are the normals to surfaces 1 and 2 respectively.
Vector L points from surface 1 to the viewpoint.
Depending on the angle between L, and N 1 & N2, they may or may not be visible to
the viewer.
L.N L . N . cos
153
Determining N:
• N=AB
• NB. Vertices are given a counterclockwise order when looking at visible side.
Limitations:
Remove the top or front face of the cube, and suddenly we can see inside, and
our algorithm falls over.
It works fine for convex polyhedra but not necessarily for concave polyhedra.
154
example of a partially hidden face, that will not be eliminated by Back-face removal.
155
TEMA 6
156
157
PROGRAMACION EN AUTOLISP
AutoLisp.- Es una adaptación del Lenguaje LISP, y forma parte integral del Auto-Cad. Un
Lenguaje de alto nivel, que no se considera ni compilador ni interprete sino esta dentro el rango
de intermedio.
Tipos de Datos.-
158
(ABS num) Retorna el valor absoluto de num.
(GCD ent1 ent2) Devuelve el máximo común divisor de ent1 con ent2.
i) En línea de Comandos.
Ejm.
159
Command: (defun seno (x) (setq xr(* PI (/ x 180.0)))
0.5
Ejm. Construir una definición para dibujar un triángulo, ingresando tres puntos (escribir
únicamente el texto en negrigllas en el prompt de AutoCad).
(_> )
TRIANGULO
Una vez construido la función Triangulo se la debe invocar (en cualquier instante mientras se
este interactuando con el AutoCad, permanece residente en la memoria). Se ingresa los tres
puntos, el programa automáticamente finalizará dibujando un triángulo, a través de la ejecución
del comando gráfico line.
160
Command: (triangulo)
Primer punto:
Segundo punto:
Tercer punto:
Command: nil
161
Comandos de programación.-
Una definición de función se ejecuta una vez cargado el fichero a la memoria, la función
permanecerá residente, dispuesta para su ejecución mientras permanezca el dialogo con
AutoCad, si la función esta antecedida por c: , significa que pueden existir en una escritura
varias funciones y esta será la principal, para su invocación no requiere de los paréntesis.
(terpri) Solo se utilizará para acompañar a las funciones que involucren entradas con
GET...
162
SETQ.- Crear y atribuir valores a variables. En el momento de la asignación, el nombre_variable
se declara implícitamente bajo algún tipo, sin embargo puede no ser definitivo.
ejm.
Utilización de Listas.-
CAR.- Extrae el primer elemento de una lista (coordenada x, cuando la lista es un punto)
(CAR lista)
163
CADR.- Extrae el Segundo elemento de una lista (coordenada x, cuando la lista es un punto)
(CADR lista)
CDR.- Retorna una sublista con todos los elementos a partir del segundo.
(CDR lista)
(CADDR lista)
(LIST x y z))
Nota: aunque ya se utilizó líneas arriba el doble punto y coma ;; se utiliza para anotar un
comentario, hasta el final de la línea.
165
(setq cad(GETSTRING T “Un texto: ”)) ;; La cadena acepta espacios e blanco.
Modo Concepto
16 (No se utiliza)
128 Permite introducir datos arbitrarios por teclado. Tiene prioridad sobre el valor 1
Ejm.
166
(initget (+ 1 2 4)) ;; o (initget 7)
ESTRUCTURAS DE PROGRAMAS.-
Una definición puede iniciarse como (defun estrella() … , normalmente esta forma de escritura
se utiliza cuando se tiene una sola función, cuando una solución se resuelve con mas de una
función, entonces será recomendable escribir (defun c:estrella() … , que representa como a la
función principal.
Ejm. Dibujar una estrella de n puntas, dado un punto centro, el radio interno y el radio externo.
167
;; Dibujar una estrella de n puntas, dados los radios: interno y externo
(defun c:estrella()
168
Ejemplo. A partir del ingreso de un punto y el grosor de la cruz esvástica, desarrollar el código
para obtener dicha figura.
;; La Cruz Esvástica
(defun datos()
(defun Puntos()
169
(setq p11(polar p10 pi g))
(command "pline" p0 p1 p2 p3 p4 p5 p6 p7 p8 p9 p10 p11 p12 p13 p14 p15 p16 p17 p18 p19
p0 "")
(defun c:Cruz()
(datos)
(Puntos)
170
Ejemplo. Problema para mostrar el empaquetamiento de varias copas de muchas filas y
muchas columnas, dados la altura y el radio de una copa.
(defun datos()
(defun Dibujar()
(command "array" "l" "" "r" nc nf (+(* 2 rc) 4) (+(* 2 rc) 4))
171
(setq p0(list 0 0 0))
(defun c:cajaCopa()
(Datos)
(Dibujar)
172
ii) Estructura condicional.-
a. Simple.
(if (cond )
(accion-verdad)
b. Doble
(if (cond)
(acción-verdad)
(acción-falso)
c. Múltiple
(cond ((= op “Opción-1”) (Acción-1))
...
Ejemplo.(parte de un programa)
173
((= op “Puerta”) (InsPuerta))
PROGN.- Secuencia consecutiva, cuerpo de una salida, para el caso de tener más de una
instrucción.
Ejm.
(if (= n 1)
(prompt “Correcto”)
(terpri)
(PROMPT “Incorrecto”)
(REPEAT número
exp-1
exp-2...
174
Ejemplo. Rastrear un triángulo equilátero, dado: el vértice de inicio y la longitud de un lado.
(defun Equi()
(repeat l
(setq d (+ d 1))
175
)
WHILE.- Repetir según condición (bucle manual, requiere modificar la variable de control del
bucle dentro el cuerpo de lo contrario se convierte en bucle infinito)
(WHILE (cond)
exp-1
exp-2…
Ejemplo. Plotear una espiral en base a un punto de inicio y el radio del primer arco.
(defun espi()
176
(setq pu (list (+ x0 r) y0) pa p0)
(setq cv 1)
(repeat n
(setq p0 p2 cv (+ cv 2))
(setq d (* cv di))
Ejemplo. Este ejemplo muestra el diseño, con uso de la estructura repetitiva while, se
recomienda ingresar los datos cuidadosamente.
sugerencia:
177
Alt.Total Grada <cm> : 250
(defun c:grada()
(setq an 20.0)
178
(setq pe (list 0.0 0.0 co))
(setq c 0.0)
(setq c (+ c co))
Ejemplo. Este ejemplo muestra como se manejan listas de mas de dos datos, se debe entender
cada línea del código para entender el programa completo. Es una generalización a partir del
triángulo de Sierpinski, ahora modificado para cualquier polígono de n lados, además la forma
de encadenar funciones, siendo la función principal Sierpi.
179
;; Generalización del Triangulo de Siarpinski.
(defun LeerPtos()
(repeat n
(setq X (cons (car pto) X)) ;; inserta un elemento al inicio de una lista
( defun DibuPoli()
(setq Xd X Yd Y)
(setq x0 (car Xd) y0 (car Yd)) ;; extrae el primer elemento de una lista
(setq p1 (list (cadr Xd) (cadr Yd))) ;; extrae el segundo elemento de una lista
(repeat (- n 1)
180
(setq x1 (car Xd) y1 (car Yd))
(setq p0 p1)
(defun nuevasCoord()
(setq i 0)
(repeat (- n 1)
(setq i (+ i 1))
181
(setq Yi (cons (/ (+ (nth i Y) yu) 2) Yi))
(defun c:Sierpi()
(LeerPtos)
(DibuPoli)
(repeat np
(nuevasCoord)
(command "text" "j" "m" Laux (/ dis 10) "" (itoa ci))
(DibuPoli)
(setq ci (+ ci 1))
182
TEMA 7
183
184
Programación en DCL y AutoLISP
Para mejor comprensión de la Programación con DCL (Dialogue Control
Language o Lenguaje de Control de Diálogos) extensión por defecto de los
ficheros texto creados para este propósito, se recomienda tener base o cierta
familiaridad con AutoLisp, en lugar de reescribir lo que se puede encontrar en
los manuales (disponibles en las ayudas de la misma empresa AutoDesk), se
enfatiza en los ejemplos casi de forma intuitiva, con la ayuda de algún material
disponible en la red web.
Los archivos .DCL son archivos de texto llano, como los archivos .MNU o
.LSP. Desde un fichero de AutoLISP se invoca referencia a los archivos .DCL
para mejorar la comunicación con el usuario. Esta es la función del DCL,
facilitar el empleo de sus programas. Los archivos .DCL y .LSP operan de la
misma manera en los entornos DOS, Windows, Sun y Mac, a pesar que los
tamaños de los letreros variarán en función de las resoluciones de la pantalla.
Algunas veces será necesario reajustar un letrero para emplearlo en diferentes
plataformas. Para tener una idea de lo que estamos hablando emplee la orden
_DDMODIFY.
185
(defun c:primer()
(setq dcl_id(load_dialog "primero.DCL"))
(new_dialog "dialog1" dcl_id)
(start_dialog)
(unload_dialog dcl_id)
(princ)
)
dialog1 : dialog {
label = ”Titulo” ;
: button {
label = ”VALE”;
is_cancel = true;
}
}
:<tipo de componente>{
186
<atributo>;
<atributo>;
<...>;
}
Orden: primer
Aparecerá un letrero de diálogo con el título que haya incluido en label y con un
botón con el mensaje que haya puesto en su label correspondiente. Cuando
pulse el botón se finalizará el letrero.
Ejercicio 1
Como es prudente comenzar sin prisas, modifique las cadenas de texto para ver
las diferencias. Intente lo siguiente:
dialog1 : dialog {
label = “Esta es mi primera rutina DCL” ;
: button {
label = “Funciona!”;
is_cancel = true;
}
}
Ejercicio 2
187
Modifique su archivo DCL como sigue:
dialog1:dialog
{ label = "Esta es mi primera rutina DCL.-";
:button
{ label = "Nada";
}
:button
{ label = "Nada tambien";
}
:button
{ label = "Cancelar";
is_cancel= true;
}
}¿Qué sucede? ¿Comprende por qué? El siguiente paso será crear botones que
realicen diferentes operaciones.
La sintaxis de :dialog. Verá que posee dos parámetros, label y value. Label
indica que si tiene asignada una cadena entre comillas (“Titulo”), la mostrará en
la barra de título de la ventana del letrero de diálogo.
Compruebe ahora la sintaxis para :button; comprobará que posee los parámetros
label, is_default, is_cancel. El último indica que si está establecido como true, el
usuario puede seleccionar dicho botón para cancelar el letrero. También se nos
indica que dentro de un letrero de diálogo solamente un botón puede tener esta
cacterística. label es el texto que muestra el botón.
Muchos de los componentes tienen atributos como label y value, pero cada uno
de ellos tiene sus reglas particulares por lo que deberá conocerlos todos. Todos
los componentes tienen un nombre personal que se llama key. Dando este
188
nombre particular a cada componente, podemos realizar tareas específicas
cuando nuestra rutina AutoLISP escucha la llamada a un nombre. En los
archivos DCL y LSP siguientes, note que hemos añadido un key a muchos
componentes. Esto le permitirá a la rutina LISP decir “¡eh, si oigo que llaman a
alguien, voy a hacer algo!. En ellos también se introduce otro tipo de
componente ... :text. Escriba lo siguiente como archivos segundo.DCL y
segundo.LSP:
dialog1:dialog
{ label = "Segundo Dialogo DCL.-";
:text
{ label = "El Boton #1:";
}
:button
{ label = "Boton-1";
key = "Tarzan";
is_default = true;
}
:text
{ label = "El Boton #2:";
}
:button
{ label = "Boton-2";
key = "Jane";
}
:text
{ label = "Pulse este boton para salir.";
}
:button
{ label = "Cancelar";
is_cancel= true;
}
}
189
(defun c:segundo()
(setq dcl_id(load_dialog "segundo.DCL"))
(new_dialog "dialog1" dcl_id)
(defun subr1()
(alert "Seleccionado Boton-1.")
)
(defun subr2()
(alert "Seleccionado Boton-2.")
)
(action_tile "Tarzan" "(subr1)")
(action_tile "Jane" "(subr2)")
(start_dialog)
(unload_dialog dcl_id)
(princ)
)
190
Si el usuario pulsa ENTER, se selecciona este botón. Al seleccionarlo DCL grita
“Tarzan”.]
: text {
label = ”El boton #2:”;
}
[Más texto.]
: button {
label = “Boton #2”;
key = “Jane”;
}
[Nuestro segundo botón tiene también un key. Cuando se selecciona, DCL le
grita “Jane” a la rutina AutoLISP.]
: text {
label = “Pulse este boton para salir.”;
}
[Más texto.]
: button {
label = “Cancelar”;
is_cancel=true;
}
[Este es nuestro botón de salida. Tiene el atributo is_cancel de modo que si se
pulsan ESC ó CTRL+C, finaliza la rutina.]
}
[Esto cierra el :dialog del comienzo.]
Veamos ahora la rutina AutoLISP:
(defun C:segundo ()
;; carga de los dcl y dialog adecuados
(setq dcl_id (load_dialog “segundo.dcl”))
(new_dialog “dialog1” dcl_id)
[Esto no ha cambiado desde nuestra primera rutina DCL.]
; qué deben hacer los botones al seleccionarlos
(defun subr1 ()
(alert “Seleccionado boton 1.”)
)
191
[Esta es una subrutina llamada “subr1” que se pondrá en funcionamiento cuando
se seleccione el Boton 1 y grite “Tarzan”.
(defun subr2 ()
(alert “Seleccionado boton 2 .”)
)
[Esta es una subrutina llamada “subr2” que se pondrá en funcionamiento cuando
se seleccione el Boton 2 y grite “Jane”.
; control de botones y rutina a ejecutar
(action_tile “Tarzan” “(subr1)”)
(action_tile “Jane” “(subr2)”)
[“action_tile” es una orden que se encuentra a la espera de que se llamen
nombres. Cuando se grita uno de los nombres, como “Tarzan”, le comunica a
AutoLISP que es lo que se debe hacer a continuación, en este caso ejecutar
“subrtn1”.
; que comience a rodar
(start_dialog)
[ Igual que antes.
(unload_dialog dcl_id)
(princ)
)
Prueba-2
midlg : dialog {
label = "Ejemplo de un cuadro
de diálogo";
192
: boxed_column {
label = "Componentes:";
: edit_box {
label = "&Cuadro de texto:";
key = "txtTexto";
edit_width = 20;
edit_limit = 100;
allow_accept = true;
}
: button {
label = " &Ver texto escrito...";
key = "cmdBoton";
}
}
ok_cancel_help_errtile ;
}
(defun c:Pruebadcl()
; Conectando con el archivo y la estructura.
(setq ind (LOAD_DIALOG "PruebaDCl.dcl"))
; Se carga en memoria
(NEW_DIALOG "midlg" ind)
; Procedimientos
(valores)
(acciones)
; Se visualiza el cuadro.
(if (= 1 (START_DIALOG))(alert "Este fue un pequeño ejemplo de
como \n utilizar cuadros de diálogo DCL con LSP."))
; Descargamos el cuadro
(UNLOAD_DIALOG ind)
(princ)
)
(defun valores ()
; Se define los valores por defecto.
(SET_TILE "txtTexto" "Construcgeek") (MODE_TILE "txtTexto" 2)
(SET_TILE "error" "Aqui se pueden visualizar mensajes de
error")
193
)
(defun acciones()
(ACTION_TILE "cmdBoton" "(MostrarMsg)")
(ACTION_TILE "accept" "(aceptar)")
(ACTION_TILE "cancel" "(cancelar)")
(ACTION_TILE "help" "(ayuda)")
)
(defun MostrarMsg()
(setq TextoIngresado (GET_TILE "txtTexto"))
(setq msg (strcat "El texto ingresado es: " TextoIngresado))
(alert msg)
)
(defun aceptar()
(Setq TextoIngresado (GET_TILE "txtTexto"))
(if (/= TextoIngresado "")
(DONE_DIALOG 1)
(SET_TILE "error" "Debes de ingresar un texto antes de
continuar.")
)
)
(defun cancelar()
(DONE_DIALOG)
(princ "\nSe canceló el programa.")
)
(defun ayuda()
(alert "\nSe indica un archivo de ayuda.")
)
;; Arbolito Navideño
( defun Datos()
(setq at (atoi(get_tile "alto")))
(setq lr (atoi(get_tile "rama")))
(setq nr (atoi(get_tile
"nrora")))
)
(defun Dibujar()
(setq rt (/ at 30.0))
(setq rr (/ lr 30.0))
(setq p1 (list 0 0 (- at lr)))
(setq pp (list 0 at))
(command "cylinder" p1 rr lr)
(command "view" "front")
(command "rotate" "l" "" pp 35)
(command "view" "top")
(command "array" "l" "" "p" "0,0"
nr "" "")
(command "cylinder" "0,0" rt at)
(command "union" "all" "")
)
(defun c:Arbol()
(command "erase" "all" "")
(command "view" "top")
(setq dcl_id (load_dialog "DatosArbol.dcl"))
195
(if (not (new_dialog "DatosArbol" dcl_id)) (exit))
(action_tile "cancel" "(setq ddiag 1) (done_dialog)")
(action_tile "accept" "(setq ddiag 2) (Datos) (done_dialog)")
(start_dialog)
(unload_dialog dcl_id)
(if (= ddiag 1)
(princ "\n \n Ejemplo Cancelado...\n")
)
(if (= ddiag 2)
(Progn
(Dibujar)
(princ "\n \n Ejemplo completado...")
)
)
(command "view" "swiso")
(princ)
)
(defun punto()
(setq p0 (getpoint "Punto Inicio: "))
(setq xi(car p0) yi(cadr p0))
)
(defun lee()
(setq xi(get_tile "xi"))
(setq yi(get_tile "yi"))
(setq ri(get_tile "ri"))
(setq re(get_tile "re"))
(setq gr(get_tile "gc"))
(setq xi(atof xi))
(setq yi(atof yi))
(setq ri(atof ri))
(setq re(atof re))
(setq gr(atof gr))
)
(defun Construir()
(setq es(- re ri))
(setq p0 (list xi yi))
(command "cylinder" p0 (+ re
gr) es)
(prompt "Todo bien-1...")
(setq c1(ssget "l"))
(command "cylinder" p0 re es)
(command "subtract" c1 "" "l" "")
(setq pm (list (car p0) (cadr p0)(- (/ es 2))))
(command "move" "l" "" p0 pm)
(command "cylinder" p0 ri es)
(setq c1(ssget "l"))
(command "cylinder" p0 (- ri gr) es)
(command "subtract" c1 "" "l" "")
(command "move" "l" "" p0 pm)
(setq rm (/ (+ ri re) 2))
198
(setq la (* (* rm 2.0) PI))
(setq n (fix (/ la es)))
(setq p1 (list (+ rm (car p0)) (cadr p0)))
(command "sphere" p1 (/ es 2.0))
(command "array" "l" "" "p" p0 n "" "")
(command "-view" "swiso")
(command "vscurrent" "C")
)
(defun c:Rodar()
(command "-view" "front")
(command "vscurrent" "2D")
(setq op (strcase (getString "Desea borrar todo [s/n]") T))
(terpri)
(if (= op "s") (command "erase" "all" ""))
(datos)
(if(= a 1)(Construir))
)
traslada:dialog
{ label = "Parámetros de
Traslación:";
:row
{:edit_box
{ label = "tx: ";
width = 6;
key = "tx";
fixed_width = true;
}
:edit_box
{ label = "ty: ";
width = 6;
key = "ty";
fixed_width = true;
}
}
ok_cancel;
}
202
rota:dialog
{ label = "Angulo de rotación:";
:edit_box
{ label = "Angulo(grados):";
key = "ang";
width = 6;
fixed_width = true;
}
}
escala:dialog
{ label = "Parámetro de escalación:";
:edit_box
{ label = "Parámetro de
Escalación:";
key = "sxy";
width = 6;
fixed_width = true;
}
ok_cancel;
}
(defun objetos()
(setq obj(ssget))
)
(defun traslacion()
(new_dialog "traslada" ddl)
(if(= tx nil)(setq tx 0.0))
(if(= ty nil)(setq ty 0.0))
(set_tile "tx"(rtos tx 2 2))
(set_tile "ty"(rtos ty 2 2))
(action_tile "accept" "(trasla)") ;;(done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)")
(setq b(start_dialog))
;;(if(= b 3)(done_dialog))
)
(defun trasla()
(setq tx(get_tile "tx"))
(setq ty(get_tile "ty"))
(setq tx(atof tx))
(setq ty(atof ty))
(setq p1 (list tx ty))
)
(defun rotacion()
(new_dialog "rota" ddl)
(if(= ang nil)(setq ang 0.0))
(set_tile "ang"(rtos ang 2 2))
(action_tile "accept" "(rot)(done_dialog 1)")
204
(action_tile "cancel" "(done_dialog 0)")
(setq b(start_dialog))
)
(defun rot()
(setq ang(get_tile "ang"))
(setq ang(atof ang))
)
(defun escalacion()
(new_dialog "escala" ddl)
(if(= sxy nil)(setq sxy 1))
(action_tile "accept" "(esca)(done_dialog 1)")
(action_tile "cancel" "(done_dialog 0)")
(setq b(start_dialog))
)
(defun esca()
(setq sxy(get_tile "sxy"))
(setq sxy(atof sxy))
)
(defun c:OT1()
(form1)
(if(= a 1)(command "move" obj "" "0,0" p1))
(if(= a 2)(command "rotate" obj "" "0,0" ang))
(if(= a 3)(command "scale" obj "" "0,0" sxy))
)
205