Вы находитесь на странице: 1из 29

1

TEMA 7 - REPRESENTACION DE SOLIDOS


Al igual que un conjunto de l neas y curvas 2D no tiene necesariamente que describir un area cerrada, un conjunto de planos y supercies 3D no tiene por qu representar un volumen cerrado. Sin embargo en muchas aplicaciones es e importante considerar a un objeto como un volumen perfectamente cerrado, y poder distinguir entre interior, exterior y supercie del objeto 3D. As por ejemplo, en las aplicaciones de CAD/CAM en donde disponemos de un objeto modelado segn su descripcin geomtrica, podemos calcular innidad u o e de operaciones sobre l antes de haberlo construido f e sicamente: puede determinarse si un objeto se solapa o intersecta con otro (un brazo robot puede esquivar los objetos del entorno), calcular volmenes y centros de masa (en u el diseo de un coche, ste debe ser lo ms aerodinmico posible), calcular n e a a la resistencia a la presin o a la temperatura (mediante el mtodo de eleo e mentos nitos), etc. Todas estas aplicaciones son ejemplos de modelado de slidos. o En el mundo real todo est construido por atomos, los cuales se juntan a formando molculas, y as sucesivamente hasta formar objetos tales como e manzanas, coches o este libro. Lo ideal ser que en el ordenador pudiera a disponer igualmente de un elemento mnimo similar al tomo con el que con a struir todos los objetos posibles. Desafortunadamente esto no es as La . memoria del ordenador slamente puede almacenar elementos binarios que o representan nmeros o s u mbolos, los cuales pueden emplearse para representar coordenadas, ecuaciones, tangentes, propiedades fsicas, etc. Por lo tanto puede armase que no existe un esquema de modelado universal que permita construir todos los objetos presentes en la realidad (ni tampoco los abstractos). Por ejemplo, un simple cubo se compone de 8 vrtices, 12 aristas y 6 e caras. Quizs la mejor forma de representacin ser almacenar las coora o a denadas cartesianas de los 8 vrtices, con los cuales podr e amos reconstruir las aristas y caras. Pero podr amos usar la misma tcnica para represene tar una esfera? En realidad s pero deber , amos usar un enorme conjunto de vrtices para poder representarla lo ms aproximada posible. Una mejor e a tcnica de representacin ser usar su ecuacin x2 + y 2 + z 2 < r2 , donde e o a o incluso podr amos saber qu puntos pertenecen al interior, al exterior o a la e supercie de la esfera. Por otro lado, qu hay de objetos ms complejos e a como el fuego, una planta, o una nube? La geometr convencional no puede a con ellos, y se necesitan tcnicas ms complejas como sistemas de part e a culas o fractales.

Finalmente, consideremos el modelo de la famosa tetera de Utah, el cual tiene un cuerpo, una tapa, un asa y un cao por donde saldr el t. Pero si exn a e aminamos el interior de su geometr descubrimos que no tiene agujero! Sin a embargo, la pregunta es realmente importa? Si estamos trabajando con una herramienta CAD y el objetivo nal es construir la tetera, por supuesto que s Seguramente deber . amos poder calcular su peso, su centro de gravedad, el a rea de su supercie y su momento de inercia, por lo que es esencial disponer de una descripcin lo ms exacta posible. Pero si por el contrario estamos o a desarrollando una pel cula de dibujos y la tetera es un elemento ms del esa cenario, entonces no nos interesara tanta exactitud. Resumientdo, esquemas de representacin hay muchos, y cul elijamos depender de la aplicacin con o a a o la que trabajemos y del tipo de objeto.

7.1 MODELOS DE ALAMBRE


El mtodo ms simple de construir un objeto 3D es hacerlo a partir de e a una coleccin de l o neas que representen los bordes rectos que identiquen la geometr del objeto en cuestin. Tal mtodo se conoce como modelo de a o e alambre (wire-frame) ya que al dibujarlo en pantalla parece que est cona struido por trozos rectos de alambre. Por ejemplo, la representacin de una o mesa ser algo parecido a la gura 1: a

Figure 1

Debido a que la unica informacin de que disponemos del objeto es el o conjunto de aristas, es imposible para los programas eliminar las l neas que quedan ocultas por alguna supercie, cosa que ocurre en la realidad. Esto es porque no disponemos de datos referentes a las caras del objeto, por lo que la imagen resultante puede considerarse como una vista transparente del

objeto. Esta propiedad puede ser util en algunas ocasiones. Por ejemplo, en las aplicaciones de diseo arquitectnico, como AutoCad, cuando se tienen n o muchos objetos en pantalla simultneamente se hace muy lento trabajar dea bido a la complejidad de cada objeto, por lo que en la fase de interaccin con o el usuario, la vista en la pantalla muestra a todos los objetos en wire-frame, lo cual es mucho ms rpido, y slo en la imagen nal es cuando mostramos a a o los objetos completamente. Si intentramos mejorar la estructura de datos aadiendo informacin a n o de cmo las aristas estn conectadas para formar supercies, estar o a amos hablando ya de otros modelos ms completos: los modelos poligonales. a

7.2 MALLAS POLIGONALES (MESHES)


Las mallas poligonales o meshes fueron el primer sistema de representacin o de objetos, ya que era el ms evidente y prctico para las mquinas existentes a a a cuando comenzaron las primeras aplicaciones grcas. Todav hoy en d a a a se siguen usando, por supuesto, salvo en aquellas aplicaciones que precisen mayor exactitud tanto en el modelado como en los clculos posteriores (reas, a a volmenes, etc.). Vamos a denir por malla poligonal a un conjunto de u aristas, vrtices y pol e gonos conectados donde cada arista es compartida al menos por dos pol gonos. Una arista conecta dos vrtices, y un pol e gono es una secuencia cerrada de aristas. Una arista puede ser compartida por dos pol gonos, y un vrtices es compartido al menos por dos aristas. e Un mesh puede representarse de varias maneras, cada una con sus ventajas y desventajas. Es tarea del programador de la aplicacin el elegir la o representacin ms apropiada, o incluso es posible elegir varias: una para o a almacenamiento, otra para uso interno de la aplicacin, otra para que el o usuario interacte con ella, etc. Las operaciones t u picas que pueden hacerse sobre un mesh son encontrar todas las aristas incidentes a un vrtice, ene contrar los pol gonos que comparten una arista o un vrtice, encontrar los e vrtices conectados por una arista, encontrar las aristas de un pol e gono, visualizar el mesh, e identicar errores en la representacin (como una arista o o un vrtice perdido). En general, mientras ms expl e a cita sea la representacin, o ms rpidas sern las operaciones, pero ms espacio de almacenamiento van a a a a a requerir.

7.2.1 Tipos de Representacin o a) Representacin expl o cita. Cada pol gono viene representado por una lista de coordenadas de vrtices: e Pi = ((x1 , y1 , z1 ), (x2 , y2 , z2 ), ..., (xn , yn , zn ))

Los vrtices se almacenan en el mismo orden que si recorriramos el pol e e gono a traves de su contorno. Existe una arista entre cada dos vrtices consecutivos e del vector, y una arista ms que conecta el ultimo vrtice con el primero. a e Para un simple pol gono, esta representacin es bastante eciente, pero o para un mesh se pierde mucho espacio, ya que las coordenadas de los vrtices e compartidos se hallan duplicadas. Adems, otra desventaja es que no hay a representacin expl o cita de las aristas y los vrtices compartidos. Por ejemplo, e para arrastar un vrtice y todas sus aristas incidentes de forma interactiva, e debemos primero encontrar todos los pol gonos que comparten dicho vrtice. e Para visualizar el mesh necesitaremos transformar cada vrtice y recortar e cada arista de cada pol gono. Si dibujamos las aristas, aquellas que estn e compartidas se dibujarn dos veces, lo cual puede causar problemas, aparte a de tardar el doble de tiempo. b) Punteros a una lista de vrtices. Cada vrtice del mesh se almae e cena una sola vez, en una lista de vrtices: e V = ((x1 , y1 , z1 ), (x2 , y2 , z2 ), ..., (xn , yn , zn )) Cada pol gono se dene como una lista de ndices o punteros a la lista de vectores. As un pol , gono formado por los vrtices 3,5,6 y 10 vendr repree a sentado por el vector Pi = (3, 5, 7, 10) Esta representacin, que puede verse en la gura 1, tiene varias ventajas o sobre el tipo anterior. Ya que cada vrtice se almacena slo una vez se e o ahorra mucho espacio. Por otro lado, la modicacin de las coordenadas o de los vrtices se hace de forma directa, sin repercutir en la informacin e o de los pol gonos. Sin embargo, an sigue siendo complicado el encontrar u los pol gonos que comparten una arista, y las aristas compartidas continan u dibujndose dos veces. a c) Punteros a una lista de aristas. Seguimos teniendo una lista V de vrtices, y adems vamos a representar cada arista por separado como un e a nuevo vector, en donde se indica cules son sus dos vrtices extremos y a qu a e e dos pol gonos pertenece: Pi = (A1 , A2 , ..., An ); Aj = (V1 , V2 , P1 , P2 ) Cuando una arista pertenece a un solo pol gono (en los contornos del mesh) P2 se pone a nulo. Un ejemplo puede verse en la gura 2. Para visualizar el mesh simplemente hay que dibujar todas las aristas, en lugar de dibujar los pol gono, evitando as las transformaciones redundantes.

V2 V = (V ,V ,V ,V ) = ((x1 ,y ,z ),....,(x ,y ,z 4 4 4 1 1 2 3 4 1 V1 P1 P2 V3 P1= (1,2,4) P2= (4,2,3) V4

Figure 2

V2 E1 V1 P1 E4 E5 V4 E3 E2 P2 V3 V = (V 2 3 ,V ,V ) 1=1((x ,y ,z ),....,(x ,V 4 4 4 4 1 1 E1 = (V 2 1 ,P , ) ,V 1 E2 = (V 3 2 ,P , ) ,V 2 E3 = (V 4 2 ,P , ) ,V 3 E4 = (V 2 1 ,P ,P ) ,V 2 4 E5 = (V 1 1 ,P , ) ,V 4 P1 = (E 4 5,E ) ,E 1 P2 = (E 3 4,E ) ,E 2

Figure 3 En ninguna de estas tres representaciones es fcil determinar qu aristas a e son incidentes a un vrtice, pues habr que inspeccionar todas las aristas. e a Por supuesto que podemos aadir informacin que expl n o citamente indique tales relaciones, pero a cambio de pagar ms coste de almacenamiento. a

7.2.2 Consistencia de las representaciones Los meshes suelen generarse interactivamente, a menudo de forma automtica a como resultado de digitalizaciones, por lo cual es inevitable encontrar errores en la representacin. Por lo tanto se hace necesario asegurarse que los o pol gonos se encuentran todos cerrados, que todas las aristas son usadas al menos una vez, y que cada vrtice es referenciado por al menos dos arise

tas. En algunas aplicaciones incluso se exige que el mesh est completamente e conectado (cualquier vrtice puede alcanzarse desde cualquier otro viajando e por las aristas), que sea topolgicamente plano (las relaciones binarias en los o vrtices denidas por las aristas puede representarse por un grafo planar) e y que no contenga agujeros. De las tres representaciones anteriores, el esquema de punteros a aristas es el ms sencillo de chequear, ya que contiene a la mxima informacin. a o

7.2.3 La ecuacin del plano o Cuando trabajamos con cada pol gono a veces se hace necesario disponer de la ecuacin del plano sobre el que se encuentra. En algunos casos dicha ecuacin o o es conocida impl citamente debido al mtodo de construccin interactivo que e o se ha usado para denir el pol gono. Pero si no se conoce, siempre podemos usar las coordenadas de los tres vrtices para encontrar el plano. La ecuacin e o de un plano se dene como: ax + by + cz + d = 0 Los coecientes a, b, c denen la normal al plano, N = (a, b, c). Esta normal es fcil de calcular si disponemos de tres puntos, P1 , P2 , P3 , pertenecientes al a plano. Slo hay que evaluar el producto vectorial o N = P1 P2 P1 P3 Si el producto es cero signicar que los tres puntos son colineales y que los a tres puntos no denen un plano, por lo que necesitaremos un vrtice ms. e a Una vez calculados los coecientes a, b, c slo queda calcular d, para lo cual o evaluaremos la ecuacin del plano en cualquiera de los tres puntos dados y o la despejaremos. Si hay ms de tres vrtices en el pol a e gono, stos pueden no ser coplanares, e lo cual puede acarrear numerosos problemas. En estos casos es mejor usar otra tcnica diferente para encontrar los coecientes que mejor aproximan el e plano a todos los vrtices. Una vez calculados podemos determinar entonces e una medida de lo no-plano que es nuestro pol gono, en base a calcular las distancias perpendiculares al plano de cada vrtice. La distancia D de un e punto a un plano viene dada por la expresin o ax + by + cz + d D= 2 a + b2 + c2 Esta distancia puede ser positiva o negativa dependiendo de a qu lado del e plano se encuentra el punto. Si el vrtice se encuentra sobre el plano, D = 0. e

7.2.4 Representacin de objetos ms complejos o a En un caso ms general, aquellas caras del objeto que no sean planas sino a supercies curvas sern aproximadas tambin como nuevos meshes, como se a e ve en la gura 2.

Figure 4

Este tipo de representacin tambin recibe el nombre de representacin o e o de fronteras (boundary representation o B-rep) ya que es en realidad una descripcin topolgica y geomtrica de la frontera o supercie del objeto. Es o o e un esquema muy utilizado en Informtica Grca, entre otras razones porque a a el modelado de objetos poligonales es simple de realizar. Sin embargo existen ciertas dicultades prcticas. La exactitud del modelo, es decir, la diferencia a entre la representacin facetada y la supercie real curva del objeto suele ser o arbitraria. Para lograr una buena calidad en la imagen, el tamao de los n pol gonos individuales debe depender de la curvatura espacial local. Donde la curvatura cambie rpidamente se necesitarn ms pol a a a gonos por unidad de rea de la supercie. Este factor debe ser tenido en cuenta a la hora de a construir los pol gonos. La representacin poligonal no slamente se usa como estructura de datos o o al modelar, sno tambin como forma intermedia de otros muchas estructuras e ms complejas. Esto es as debido a que esta representacin ha sido la tcnica a o e tradicional durante muchos aos, y la mayor de los algoritmos desarrollados n a en el campo de los grcos trabajan con esta representacin. Por ejemplo, los a o algoritmos de iluminacin de pol o gonos han sido tan optimizados que algunos tarjetas grcas de ordenador ya los llevan implementados en hardware. Por a lo tanto, si disponemos de un objeto denido mediante patches bicbicos u como los que ve amos en el cap tulo anterior, una buena estrategia de visualizacin ser convertirlos a mallas poligonales y mandarlos directamente al o a hardware. En el caso ms sencillo, un mesh poligonal es una estructura de datos que a consiste en una lista de pol gonos representados por las coordenadas (x, y, z)

de sus vrtices. Ya vimos en el cap e tulo anterior los distintos subtipos de representacin posibles. Adems de esta informacin podemos almacenar o a o como parte de la representacin del objeto otra informacin geomtrica que o o e pueda ser usada en procesos de clculo posteriores. Por ejemplo, ya hemos a dicho que para muchos procesos es necesario conocer las normales a un punto de la supercie. Si las calculsemos todas inicialmente y las almacenramos a a en la propia estructura de datos, los clculos posteriores ser ms rpido. a an a a Por supuesto, la contrapartida es que nuestro modelo requerira ms espacio a de almacenamiento. Otra idea conveniente puede ser ordenar los poligonos en una estructura jerrquica, como en la gura 3, en donde los pol a gonos se agrupan en supercies, y stas en objetos. De esta manera, un cilindro posee tres supere cies: dos caras planas arriba y abajo y una supercie curva. La razn para o esta agrupacin es que as podemos distinguir entre aristas que son parte de o la aproximacin (las aristas entre rectngulos adyacentes sobre la supercie o a curva del cilindro) y aristas que existen en la realidad. Esto puede ser muy util por ejemplo para los algoritmos de iluminacin a la hora de sombrear sin o cambios abruptos la pared del cilindro.

Figure 5

La caracter stica importante de esta representacin es que los pol o gonos son entidades independientes entre s y por lo tanto pueden ser tratados individualmente. Es decir, calcular el rea de la supercie de un objeto ser a a tan fcil como calcular el rea individual de cada pol a a gono y sumarlas todas.

7.2.5 Modelado de objetos poligonales Aunque el mesh poligonal es la forma de representacin ms comn en ino a u formtica grca, el modelado aunque es simple es tambin tedioso. La popa a e ularidad de esta representacin ha sido debida a la facilidad para modelar, o la aparicin de tcnicas de iluminacin para objetos poligonales, y el hecho o e o

importante de que no existe restriccin alguna de la forma o complejidad del o objeto que se est modelando. a Las estrategias de modelado son principalmente de fuerza bruta. Una vez tenemos una aproximacin inicial del objeto a modelar, interactivamente o vamos moviendo los vrtices y estirando y encogiendo los pol e gonos hasta lograr el objeto nal, bien de forma ordenada mediante cdigo o macros, o o bien de forma arbitraria. Para poder conseguir la aproximacin inicial hay o varias estrategias dependiendo del objeto y del material de que dispongamos: a) Modelado manual. La forma ms fcil de modelar un objeto real a a es manualmente mediante un digitalizador 3D. El operador dispone de una especie de lpiz con el que va tocando la supercie del objeto. El ordenador a detecta la coordenada (x, y, z) de la punta del lpiz en el espacio y almacena a ese punto. El usuario usa su experiencia y su juicio para colocar los puntos sobre el objeto donde quiere que vayan los vrtices de los pol e gonos, aumentando la densidad en las zonas de alta curvatura. Una vez en el ordenador todos esos puntos se genera una red que forma la supercie del objeto. Donde las l neas curvas de la red intersecten se dene la posicin de los vrtices de o e los pol gonos. b) Generacin automtica. Un dispositivo capaz de crear una malla o a poligonal de alta resolucin de un objeto real es un scanner laser 3D. Se o coloca el objeto sobre una tabla rotatoria delante del rayo. La tabla adems a se mueve verticalmente. Cuando empieza el proceso, el rayo va detectando un conjunto de contornos (la interseccin del objeto con un conjunto de planos o paralelos muy cercanos entre s a diferentes alturas, midiendo la distancia a ) la supercie del objeto. Un algoritmo de skinning (skin = piel) va procesando cada par de contornos convirtindo los datos de la supercie en un e alto nmero de pol u gonos. En la gura 4 se aprecia la evolucin de este algoo ritmo, y tambin un caso concreto: una cabeza de estatua poligonizada con e esta estrategia usando 400.000 poligonos.

Figure 6

10

c) Modelado matemtico. Est claro que cuando disponemos de la dea a scripcin matemtica del objeto a modelar, lo ms fcil es usar un algoritmo o a a a que vaya evaluando la ecuacin en distintos puntos y considerando cada resulo tado como el vrtice de un futuro pol e gono. La resolucin de dichos pol o gonos se controla tambin directamente por el algoritmo de generacin, por lo que e o habr que tener en cuenta en qu zonas deben evaluarse mayor cantidad de a e puntos. d) Extruding. Esta es una de las tcnicas ms rpidas para construir e a a objetos con forma de paraleleppedos. Partiendo de un pol gono, el cual consideraremos que representa un corte transversal de nuestro objeto, lo desplazamos a lo largo de un eje de coordenadas y ya tenemos el objeto, como el que aparece en la gura 5.

Figure 7

La tarea de construir la supercie corre a cargo del programa correspondiente que la realiza de forma automtica. Todo lo que se requiere conocer a es simplemente las coordenadas de los vrtices del pol e gono que representa la seccin transversal, y la longitud de la extrusin. o o Un desarrollo de esta tcnica consiste en construir no slamente un pol e o gono al principio y otro al nal, sino una familia entera de polgonos a diferentes distancias discretas, a la vez que el pol gono va siendo rotado alrededor del eje. Esto produce objetos twisted (retorcidos?) como el que se ve en la gura 6. Y todav podemos seguir complicndolo, haciendo que incluso el propio a a pol gono vaya cambiando de forma a medida que nos vamos moviendo. Idealmente, un buen programa deber permitir al usuario especicar las secciones a inicial y nal (pudiendo ser distintas entre s y un angulo de rotacin para ) o aplicar a la seccin en cada etapa. o

11

Figure 8 e) Sweeping. Es una extensin del extruding. Si en esta tcnica o e bamos moviendo el pol gono por uno de los ejes, ahora vamos a moverlo a lo largo de una curva arbitraria en el espacio (por ejemplo cualquier curva cbica u paramtrica). De esta manera podemos construir objetos an ms variados, e u a como el que muestra la gura 7.

Figure 9 Sin embargo existen ligeros problemas que no aparec en el extruding. an Consideremos el simple caso de mover una seccin transversal constante a lo o largo de la curva Q(t). Para ello habr que denir intervalos en la curva en a los cuales ir colocando el pol gono, y luego ir uniendo vrtice a vrtice con el e e pol gono anterior mediante l neas rectas. Las cuestiones que se plantean son: qu intervalos debo escoger?, cul es la orientacin del pol e a o gono a medida que se mueve por la curva? En cuanto a la primera pregunta, dividir el parmetro t en intervalos a

12

iguales no tiene por qu dar los mejores resultados. Adems, intervalos iguales e a en t no representan necesariamente intervalos iguales en la curva1 . Lo ideal es que los intervalos dependan de la curvatura de cada zona de la curva. Si sta es alta debe existir un nmero alto de pol e u gonos para representar con detalle dicha zona. La forma ms directa de hacer esto es usar el algoritmo a de subdivisin de la curva hasta que consigamos tramos planos, y colocar un o pol gono entre cada dos tramos. En cuanto a la segunda pregunta, necesitamos denir un sistema de referencia que viaje por la curva, y que mantenga el pol gono siempre perpendicular a sta. Para lograr esto necesitamos denir tres vectores ortogonales e entre s que formen los ejes de coordenadas. Uno de ellos ser la tangente a en t a la curva, y otro indicar en todo momento la vertical con respecto a a la curva. El tercer vector es simplemente el producto vectorial de los dos anteriores, tal y como se muestra en la gura 8.

Figure 10 f) Supercies de Revolucin. Esta tcnica es la idnea para construir o e o objetos tales como vasos, esferas, botellas, y en general aquellos que tengan simetr con respecto a un eje central. Para generar dicho objeto slo es a o necesario un pol gono que representar el contorno 2D de un lado de la gura. a Dicho pol gono es rotado 360o alrededor de un eje hasta lograr una supercie cerrada que represente al objeto. En la gura 9 puede verse un ejempo de construccin de una copa de vino:F o jense que la supercie nal se ha construido en base a pol gonos, y el nmero de ellos depende del nmero u u de vrtices existentes en la curva original del contorno, y del incremento del e a ngulo en cada etapa de la construccin. o Al igual que ocurr con las dos tcnicas anteriores, las supercies de reva e
Recordemos que t pod considerarse como la velocidad a lo largo de la curva. Valores a de t igualmente distanciados no implican puntos de la curva igualmente distanciados.
1

13

Figure 11 olucin puede construirse automticamente. El usuario solo debe especicar o a la curva que representa el contorno, el nmero de incrementos durante la u rotacin, y el eje sobre el cual se va a hacer la construccin. Tal programa o o slo fabricar objetos simtricos, aunque podr crearse mejoras, como por o a e an ejemplo que en la etapa de construccin, la curva que identica el contorno o fuera variando durante la rotacin, o incluso que el propio eje de rotacin o o fuera movindose a lo largo de una curva arbitraria. El l e mite est en la a imaginacin. o

7.3 PATCHES BICUBICOS


Si consideramos la representacin anterior mediante una malla de pol o gonos, y sustituimos cada uno de ellos por un patch bicbico de los que ve u amos en el tema anterior, estaremos hablando entonces de una red de patches (patch mesh). Cada patch es una supercie curva Q(s, t) donde 0 s, t 1, los cuales mantienen algn tipo de continuidad entre sus patches vecinos. u Para la mayor de las aplicaciones, el modelar o construir una estructura a de datos que represente un objeto tridimensional es ms dif si se usan a cil patches bicbicos que usando representacin poligonal, ya que usando un u o digitilizador 3D o un scanner con el software apropiado ya hemos visto que podemos generar rpidamente gran cantidad de polgonos que representen a objetos muy complejos. Cuando trabajamos con patches, suponiendo que stos sean de Bezier, necesitaremos 16 puntos de control para cada patch, e y adems debemos mantener la integridad de la representacin, en cuanto a a o mantener los requisitos de continuidad entre patches. Por todo ello, la descripcin de una malla de patches suele generarse de forma semi-automtica, o a como veremos en la siguiente seccin. o

14

Pero a pesar de esta desventaja, la diferencia en calidad es la que garantiza su uso extendido en las aplicaciones de CAD. La representacin es sencilla, y o usando el software apropiado para poder modicar la posicin de los puntos o de control podemos ajustar la forma del objeto que estemos modelando. Esto puede verse en la gura 10.

Figure 12

Otra gran ventaja es que al tener una descripcin anal o tica exacta de la supercie, las propiedades f sicas tales como masa, volumen, area y momentos de inercia pueden extraerse de dicha descripcin. Esta propiedad es totalo mente aprovechada por las aplicaciones CAD. Por ultimo, hay que mencionar que la representacin de objetos de alta resolucin por medio de pol o o gonos necesita un alto coste de almacenamiento y de tiempo de cmputo. De heo cho, en escenas con muchos objetos complejos casi debe ser tratado como una base de datos. Por el contrario, usando patches bicbicos obtenemos u una representacin mucho ms exacta con mucho menos coste de memoria. o a Veamos un ejemplo donde se comparan ambas estructuras de datos, y por supuesto tomaremos como objeto modelo la famosa tetera de Utah. En la gura 11a) se han dibujado varias l neas con s y t constante para cada patch. El objeto est compuesto de 32 patches de Bezier, y se puede ver sombreado a y con l nea gruesa un patch concreto. En la gura 11b) se ven los puntos de control en wire-frame (la zona sombreada se corresponde con los puntos de control del patch sombreado). En la gura 11c) se muestra un wire-frame de los bordes de cada patch. Como para cada patch son necesarios 16 puntos de control, para almacenar los 32 patches necesitaremos 32 16 = 512 puntos de control, aunque en

15

Figure 13

realidad son menos, ya que la mayora de los patches comparten 12 puntos de control con sus patches vecinos. En este caso han sido necesarios 306 puntos de control. Cada punto requiere 3 coordenadas, donde cada una es un nmero real (4 bytes). Esto nos lleva a que necesitamos 306 3 = 918 u nmeros reales (36 Kb). u Ahora veamos lo que supondr mantener el mismo objeto mediante mala las poligonales. En primer lugar, una resolucin equiparable visualmente a o la del dibujo ser sustituir cada patch por 64 pol a gonos, y digo visualmente porque recordemos que usando patches bicbicos podemos aumentar la resu olucin cuando queramos (los pol o gonos una vez elegidos son jos) y adems a realizar clculos exactos sobre la geometra del objeto. Pero bueno, pues an a u as requerir , amos 6432 = 2048 pol gonos, que a cuatro vrtices por pol e gono nos salen 2048 4 = 8192 puntos, de 3 coordenadas cada uno: 8192 3 = 24576 nmeros reales (96 Kb). Es decir, una representacin inexacta de la u o misma tetera requerir 96/3.6 = 26. 6 veces ms de memoria. a a Por si fuera poco an existe otra ventaja adicional. Supongamos que u queremos obtener una imagen de una cierta escena en la que hay numerosos objetos, entre ellos la tetera, y sta queda bastante lejos del observador, por e lo que slo se proyectar sobre una pequea area sobre la pantalla. Usando o a n un modelo poligonal realizaremos un cierto coste computacional para dibujar el objeto en pantalla, y dicho coste ser independiente del tamao que ste a n e ocupe en la imagen nal. Pero si estamos usando una red de patches, y

16

adems usamos un esquema de subdivisin que vaya convirtiendo los patches a o a pol gonos hasta que stos sean planos o hasta que su proyeccin se halle e o contenida en un unico pixel de la pantalla, el coste en ese caso ser mucho a menor. Slo hay que ver que el esquema poligonal estar sobreescribiendo o a 2048 pol gonos diferentes sobre los mismos pixels.

7.3.1 Modelado de objetos mediante patches bicbicos u Existen dos estrategias prcticas de modelado que pueden usarse para obtener a una aproximacin inicial de patches, a la que luego habra que ajustarle sus o puntos de control. a) Surface Fitting. (ajustado de supercie?) Es bsicamente un a mtodo particular de realizar interpolacin de supercie. Se dispone de un e o conjunto de puntos que descansan sobre la supercie del objeto que queremos representar, y el objetivo es producir una descripcin de los patches a partir o de dichos puntos. De forma similar a cmo ajustamos una l o nea a travs de e un conjunto de puntos del plano, ajustaremos una supercie a travs de un e conjunto de puntos del espacio 3D. As esta tcnica puede usarse para mode e lar objetos de los que conocemos ya algunos puntos, bien sea porque el objeto es abstracto, o porque los hemos recogido previamente con un digitalizador. Por supuesto, la diferencia entre esta tcnica y obtener una representacin e o poligonal con dichos puntos es que obtenemos una supercie continua a partir de los puntos. Sin embargo, hay que tener en cuenta el detalle que supone que en el caso de un objeto real, la supercie denida por los patches no coincida exactamente con la supercie de la cual se extrajeron los puntos digitalizados. La exactitud de la representacin va a depender del nmero de o u puntos iniciales, as como de la extensin espacial de los patches en la red. o El principio del proceso es el siguiente: partimos de un conjunto de puntos 3D. El siguiente paso es ajustar una curva a travs de los puntos en dos e direcciones paramtricas perpendiculares, s y t. Esta red de curvas se divide e en un conjunto de cuadrilteros curvil a neos, los cuales forman los bordes de los patches individuales. En cada cuadriltero se crean los puntos de control a necesarios para cada patch, y nalmente se construye la red de patches. En la gura 12 se ilustra el proceso seguido, as como un ejemplo en el que a partir de los puntos digitalizados de una cara se ha construido primero la red de patches, y luego se ha sombreado. b) Cross-sectional sweeping. (?) De la misma forma que realizbamos a un sweeping de un pol gono alrededor de una curva arbitraria para generar un objeto pol gonal, en este caso el pol gono se convierte en una nueva curva cbica. Esta curva, que representar la seccin transversal de la supercie a u a o

17

Figure 14 modelar, se va colocando a intervalos apropiados a lo largo de la curva que indica la trayectoria (curva de sweep), usando las mismas tcnicas que coe mentbamos con anterioridad. En la gura 13 se ilustra este proceso, donde a pueden verse dos curvas seccionales colocadas en dos posiciones consecutivas a lo largo de la curva de sweep. A partir de los dos extremos de estos dos segmentos generamos otras dos curvas. Estas cuatro curvas forman los bordes de un unico patch, y de ellas obtenemos la descripcin necesaria para dicho o patch. Luego se siguen colocando ms curvas seccionales. a

7.3.2 Supercies Ruled (Ruled Surfaces) Este tipo de supercies est a mitad de camino entre los patches cbicos a u y los pol gonos. En una de las direcciones parmetricas seguimos teniendo a segmentos curvos, pero en la otra direccin slo tenemos rectas, como se ve o o en la gura 14. Un ejemplo pueden ser las paredes de los cilindros y los conos. Un mtodo conveniente para crear tales supercies es usar una aproximacin e o paramtrica para las dos curvas, e ir interpolando linealmente el espacio entre e ambas. Es decir, si Q1 (t) y Q2 (t) representan las dos curvas, siendo 0 t 1, la supercie vendr dada por a Q(s, t) = (1 s)Q1 (t) + sQ2 (t), siendo 0 t, s 1

18

Figure 15

Figure 16 En realidad, las curvas de la direccin t no tienen por qu ser curvas o e cbicas. Alguna de ellas podr ser una recta, o una semicircunferencia, y u a seguir siendo supercies de este tipo. Incluso ambas podr ser rectas, an an en cuyo caso recibir el nombre de supercies bilineales. an

7.4 GEOMETR SOLIDA CONSTRUCTIVA (CSG) IA


Los dos modelos anteriores, mallas de pol gonos y de patches, pertenecen a la categor de los esquemas de representacin de fronteras. En estos esquea o mas la construccin de los objetos 3D se hace a partir de una descripcin o o

19

de su supercie. Pero existen otra categor de esquemas, conocidas como a esquemas de representacin volumtrica, que como su propio nombre ino e dica describen el volumen interno al objeto, pudiendo por tanto almacenar propiedades del interior, tales como peso, presin interna, o incluso como posicin qu o mica. La geometr slida constructiva (CSG en ingls) es un tipo de reprea o e sentacin volumtrica que facilita en gran medida la interactividad en el o e modelado de slidos. La idea es llegar a construir los objetos mediante una o combinacin adecuada de volmenes bsicos elementales, conocidos como o u a primitivas geomtricas, las cuales pueden ser esferas, conos, cilindros, cue bos, etc. Estas primitivas se combinan usando un conjunto de operadores booleanos y una serie de transformaciones lineales. Cada objeto se almacena como un arbol. Los nodos hoja contienen a las primitivas, y los nodos no terminales almacenan los operadores booleanos o las transformaciones lineales que deben aplicarse. Debido a que la representacin no slamente dene la forma del objeto sino adems todas las o o a etapas necesarias para su construccin, el realizar modicaciones a los objeo tos es muy sencillo. Por ejemplo, incrementar el dimetro de un agujero que a atraviese un slido rectangular implica una sencilla modicacin (aumentar o o el radio de la primitiva cilindro). Esto constrasta con la representacin por o fronteras, donde efectuar la misma alteracin no es nada trivial. o El conjunto de operadores booleanos que se usa para la representacin o tambin es usado como tcnica del interface de usuario. Este puede especie e car primitivas y combinarlas usando estos operadores. La representacin o del objeto es una grabacin de las operaciones que interactivamente ha o ido ejecutando el usuario. Es por esto por lo que se dice que el modelado y la representacin no estn separados: el modelado se convierte en la repo a resentacin. Veamos un ejemplo que demuestre tal armacin, con la gura o o 15. Existen distintos tipos de operaciones booleanas. En la gura 15 pueden verse las tres operaciones ms frecuentes entre slidos: la unin, que incluye a o o todos los puntos que pertenezcan al interior de cualquiera de los objetos, la substraccin, que elimina los puntos del primer objeto que pertenecen o tambin al segundo, y la interseccin, que slamente mantiene los puntos e o o pertenecientes a ambos objetos. As con estos tres pasos hemos creado el , objeto de la gura de una forma super sencilla. Imaginen crear el mismo objeto usando una representacin poligonal (o incluso almbrica). Claro est o a a que el tipo de objetos ideal para esta tcnica son aquellos que poseen una e geometr inherente clara, como por ejemplo todo tipo de piezas mecnicas. a a Las aplicaciones CAD/CAM son sus clientes ms allegados. a En la gura 16 puede verse una representacin que reeja la construccin o o

20

Figure 17 de un objeto simple. Aparecen tres primitivas en las hojas del rbol: dos cajas a y un cilindro. Las cajas se combinan mediante una unin y luego se genera o un agujero en medio deniendo un cilindro y luego restando. Obsrvese como e las dos cajas de los nodos hojas son diferentes entre s Signica esto que . son dos primitivas diferentes? No, existe una unica primitiva para las cajas, que puede ser un cubo unidad inicialmente. Cualquier otra caja, sea sta e ms ancha o menos alta, se generar a partir de dicha primitiva mediante la a a transformacin lineal correspondiente. o La gura 17 muestra dos ejemplos en los que puede apreciarse la verdadera potencia de esta tcnica. En el primero de ellos, dos piezas desarrolladas e por separado se combinan para formar la conguracin deseada mediante o un operador unin seguido por un operador de substraccin. El segundo o o ejemplo muestra un objeto complejo construido a partir de la unin de varios o cilindros, los cuales han sido restados a una esfera. Este segundo objeto es casi imposible de describir de forma tan exacta con ningn otro mtodo. u e Pero no todo son ventajas. Un problema prctico es el tiempo de clculo a a requerido para producir una imagen del modelo. Otro problema es la limitacin de las operaciones disponibles para crear y modicar el slido. Las o o operaciones booleanas son globales, afectan al slido completo. Una opo eracin local, como una modicacin detallada en una cara de un objeto o o

21

Figure 18

Figure 19

22

complejo no es fcilmente implementable usando el conjunto de operadores a booleanos. Este hecho ha provocado que muchas aplicaciones usen B-rep internamente para la representacin de los objetos. Es decir, aunque en la o fase de construccin vayamos creando el arbol de operaciones, nalmente lo o tranformamos en una malla poligonal para crear la imagen o almacenar la estructura de datos. Una ventaja ms: el esquema CSG permite de forma fcil examinar el a a interior de un objeto modelado con esta tcnica. Esto se logra realizando la e interseccin del objeto con un plano de corte que lo divida en dos, con lo o que podemos ver con detalle cualquier corte transversal. Esto se usa mucho en publicidad o en v deos explicativos donde se quiera mostrar con detalle el interior de algn objeto. u Pero para poder lograr toda esta potencia, se necesita implementar algn u mecanismo en el ordenador (lgicamente) que soporte la matemtica y la o a geometr que lleva inherente esta tcnica. Bsicamente, se suele almacenar a e a un sistema de inecuaciones para cada primitiva que indica para un punto de coordenadas (x, y, z) si se encuentra dentro o fuera del objeto. Por ejemplo, para una esfera con centro en el punto (xc , yc , zc ) y radio r es tn fcil como a a (x xc )2 + (y yc )2 + (z zc )2 r2 Para una caja ser necesarias una inecuacin para cada una de las 6 caras, an o que indicara si un punto est por el lado de fuera o por el de dentro del a plano que contiene a la cara. Un punto estar dentro de la caja si vericase a las seis inecuaciones. Con esta informacin, la aplicacin de los operadores o o booleanos van combinando los sistemas de inecuaciones hasta llegar al objeto nal.

7.5 TECNICAS DE SUBDIVISION ESPACIAL


Este tipo de tcnicas son mtodos que consideran el espacio completo del e e entorno del objeto. Dicho espacio es subdividido en zonas o celdas adjuntas y no intersectantes, y cada uno de esas zonas o celdas es etiquetada con el objeto al que pertenece (si es que pertenece a alguno). Suele usarse como estructura de datos secundaria o auxiliar. Por ejemplo, generar la imagen de un objeto representado por un rbol CSG directamente no es tarea fcil. Una a a alternativa vlida puede ser convertir el arbol a un esquema de subdivisin a o espacial y generar la imagen a partir de ste ultimo. e Dentro de este tipo de tcnicas existen varios modelos. e

23

7.5.1 Descomposicin en celdas o Es una de las formas ms generales de subdivisin espacial. Se dene un a o conjunto de celdas primitivas bsicas, con las cuales se forma el objeto (es a como jugar al Lego). Estas celdas no pueden solaparse, y el unico operador booleano permitido es la unin. La estructura de datos que representa al obo jeto es simplemente un array de celdas (cada celda con su posicin y tamao). o n Un ejemplo puede verse en la gura 18.

Figure 20

7.5.2 Enumeracin de la ocupacin espacial o o Es un caso especial de descomposicin en celdas, en la cual el objeto se o descompone en celdas idnticas alineadas seg n una malla regular. Estas e u celdas reciben el nombre de voxels, por su similitud con los pixels. El proceso es muy parecido. Representar mediante pixels un c rculo en la pantalla es tan fcil como discretizar la pantalla (dividir toda la pantalla en una malla de a pequeos cuadraditos) e indicar para cada pixel si pertenece o no al interior n del c rculo (por ejemplo los que pertenezcan se pintarn de un color y los que a no de otro). De forma similar se realiza el proceso 3D: el espacio alrededor del objeto es discretizado en una malla 3D de pequeos cubitos, y cada cubito n es etiquetado indicando si pertenece o no al interior del objeto. La gura 19 muestra un donut representado con esta tcnica. e El voxel t pico suele ser un cubo, pero no es el unico tipo de primitiva que podemos usar. A diferencia de la tcnica anterior de descomposicin en e o celdas, slo existe un tipo de primitiva, y tanto la posicin como el tamao de o o n cada una de ellas es unico e invariante, y vendr denido por la resolucin de a o la malla. Para cada voxel solamente podemos indicar ausencia o existencia de algn objeto de forma booleana. Es decir, o pertenece en su totalidad u o no pertenece. No vale decir que la mitad derecha del voxel pertenece al objeto y la otra mitad no. Es por eso que en la gura anterior se nota el efecto escalera o aliasing en la frontera del objeto. La unica manera de

24

Figure 21

evitarlo es aumentando la resolucin de la malla de voxels, haciendo stos o e ms pequeos. Para representar un objeto slo hay que decidir qu voxels a n o e pertenecen al objeto y cules no. De esta manera el objeto vendr especicado a a por un array de voxels ocupados. Usando esta tcnica es fcil saber si un punto del espacio pertenece o no a e a un objeto, o determinar cundo dos objetos son adyacentes. Esta propiedad a es explotada en la mayor de las aplicaciones biomdicas para representar a e datos volumtricos obtenidos desde tomograf (TACs). La gran ventaja es e as que, al contrario que ocurr con los esquemas B-rep, tengo informacin sobre a o el interior de objeto. Por ejemplo, en la gura anterior del donut, los voxels que caen en el interior del donut no se ven, pero s estn almacenados en la a estructura de datos. Por ello, en una aplicacin mdica puede tenerse por o e ejemplo un brazo modelado con esta tcnica, y almacenar en cada voxel del e brazo no slo su pertenencia a ste, sino adems a qu tipo de tejido pertenece o e a e (hueso, nervio, vena, etc.), con lo que el mdico usuario del sistema podr e a visualizar en pantalla slamente el tipo de tejido que deseara. o Entre sus desventajas est la ya comentada de la prohibicin de una ocua o pacin parcial dentro de un mismo voxel. Esto provoca que los unicos o slidos que pueden ser representados con total exactitud son aquellos cuyas o caras sean paralelas a las caras de los voxels, y cuyos vrtices coincidan exe actamente con la malla. Al igual que ocurre con los pixels en un bitmap, las celdas pueden ser tan pequeas como se quiera para aumentar la exactin tud de la representacin, a costa de un aumento importante de memoria, ya o que para representar un objeto con n voxels de resolucin en cada dimensin o o 3 necesitaremos almacenar n voxels.

25

7.5.3 Octrees Los octrees son una variacin jerrquica del esquema anterior, que intenta o a evitar el excesivo coste de almacenamiento. La idea es describir de forma jerrquica mediante un arbol octal la distribucin de los voxels, en lugar de a o hacerlo mediante una lista exhaustiva de ellos. Est basado en la misma esa tructura que los quadtrees, empleados en el tratamiento de imgenes. Veamos a primero en qu consisten los quadtrees y luego veamos su extensin a 3D. e o Supongamos que tenemos la imagen de la gura 20, y queremos obtener una representacin de ella por medio de un quadtree. Se supone que la imagen o representa una escena bidimensional a nivel de pixels.

Figure 22

Comenzamos a crear el arbol considerando una regin cuadrada que rep o resente el espacio total de la escena (en 3D ser un cubo). Esta regin a o vendr representada por el nodo ra del rbol. Como la regin se encuentra a z a o ocupada por objetos en su interior, la subdividimos en cuatro subregiones, representadas por los cuatro nodos hijos en el rbol (en 3D ser 8 hijos). a an A continuacin cualquiera de las subregiones que se encuentre ocupada por o objetos se va subdividiendo recursivamente, hasta que el tamao de la subn regin se corresponda con la resolucin mxima permitida (pixels en 2D y o o a voxels en 3D). De esta manera, al nal del proceso tendremos un rbol que a me representa la totalidad de la escena, como se ve en la gura 21. El orden en el que se almacenan los hijos debe ser establecido previamente. Existen dos tipos de nodos hoja en el arbol. Unos correspondern a subre a giones que no contienen a ningn objeto, mientras que otras correspondern u a a voxels de m nimo tamao que se encuentran ocupados por parte de algn n u objeto. Obsrvese que en el caso 2D, los objetos se representan por su frone tera, y el espacio de su interior se cuenta como espacio no ocupado. En el caso 3D, los objetos se representan por su supercie, y slo podremos subdividir o

26

Figure 23 regiones que contengan parte de la supercie. Una vez visto el quadtree, la denicin para el octree es automtica. El o a nodo ra representa el volumen total de la escena. Cada nodo se divide en z ocho subregiones (octantes), y recursivamente se van subdividiendo como en el caso 2D hasta que el volumen al que representan est vac o se llegue al e o tamao m n nimo para un voxel. Existen dos formas diferentes para representar una escena mediante un octree. La primera es tal y como acabamos de ver, obteniendo una representacin completa de los objetos en la escena. El o conjunto de voxels ocupados por el objeto constituye la representacin del o objeto. Esta forma viene muy bien para escenas simples con pocos objetos. Sin embargo, para una escena compleja, se requiere un alto coste computacional para descomponer el espacio ocupado en un largo nmero de voxels, u as como un enorme volumen de memoria. Una alternativa comn es usar u una estructura de datos estndar para representar a los objetos, y usar el a octree exclusivamente para representar la distribucin de los objetos dentro o de la escena. En este caso, un nodo hoja que representase una regin ocuo pada indicar un puntero a la estructura de datos de cualquier objeto que a intersectase la regin. Esta alternativa se muestra en la gura 22, aunque o usando quadtrees para verlo ms fcil. a a En este caso, el proceso de subdivisin naliza cuando la regin ocupe o o slamente un objeto. Una regin representada por un nodo hoja no tiene por o o qu estar completamente ocupada por el objeto asociado a ella. La forma del e objeto en el interior de la regin vendr descrita por su representacin en la o a o estructura de datos correspondiente, la cual vendr compuesta por pol a gonos o patches, en el caso de estar trabajando con modelos de supercie para

27

Figure 24 los objetos. En general, una regin ocupada representada por un nodo hoja o podr intersectar con varios pol a gonos, en cuyo caso vendr representada por a una lista de punteros a las estructuras de datos de los objetos.

7.5.4 Arboles BSP Este tipo de rboles siguen siendo en esencia octrees, pero la estructura de a links en el rbol es ligeramente diferente. Las siglas BSP vienen del ingls a e (como siempre) y signican particin espacial binaria. Es decir, en cada o subdivisin dividimos la regin en dos mitades, por lo que el nmero de hijos o o u de cada nodo siempre es dos (los que tengan hijos). En la gura 23 se muestra un ejemplo, aunque de nuevo en 2D donde es ms fcil de ver. a a En dicha gura puede verse la representacin para un solo nivel de subo divisin usando un quadtree, y la misma representacin, que necesita dos o o niveles, usando un rbol BSP. En el primer nivel se ha dividido a lo largo del a eje x, obteniendo la mitad superior y la inferior de la regin inicial. En el o segundo nal, cada subregin se vuelve a subdividir por la mitad, pero esta o vez a lo largo del eje y. La extensin a 3D es directa: har falta un nivel o a ms para subdividir a lo largo del eje z. Cada nodo no terminal del rbol a a representa un plano de corte que divide el espacio ocupado en dos mitades. Un nodo hoja representa una regin que no ha sido subdividida y que cono

28

Figure 25 tiene punteros a las estructuras de datos que representan a los objetos que intersectan la regin. o Subdivisin adaptativa o Cuando usamos un rbol BSP para representar una subdivisin del espacio a o en celdas cbicas, en realidad no hay prcticamente diferencia con el hecho u a de usar un octree. Sin embargo, la verdadera utilidad de los arboles BSP es cuando no exigimos que las subdivisiones sean siempre en celdas cbicas, u es decir, que cada regin se subdividad siempre en dos mitades iguales. De o hecho, la idea original de este tipo de arboles consideraba el hecho de poder dividir el espacio usando planos de corte con cualquier orientacin. Por ejemo plo, existen aplicaciones que eligen los planos de corte para que en cada subdivisin separen dos objetos entre s dejando uno a un lado y otro al otro, o , con lo que el nmero de subdivisiones, y por tanto de niveles del rbol, es u a mucho ms pequeo. a n Por otro lado, normalmente los objetos de la escena no se encuentran uniformemente distribuidos dentro del espacio. Ms an cuando dichos oba u jetos son los patches o pol gonos que aproximan las supercies de los objetos reales. Un objeto real vendr representado por un largo conjunto de patches a conectados en el espacio, y existirn regiones extensas de espacio vac entre a o los objetos. Cuando elijamos la posicin para los planos en funcin de la diso o tribucin de los objetos en la escena, diremos que hemos aplicado subdivisin o o adaptativa para simplicar el arbol BSP. En la gura 24 podemos ver un ejemplo de esta subdivisin frente a la o subdivisin normal. Supongamos la regin que se muestra conteniendo 16 o o objetos, etiquetados desde a hasta p. Estos objetos se encuentran distribuidos de forma no uniforme en el interior de la regin. En la gura a) vemos el o BSP tradicional, de forma similar a como lo har un quadtree. La mxima a a profundidad de este rbol es 8, que adems es la longitud mxima de bsqueda a a a u requerida para identicar a qu regin pertenece un punto determinado. En e o la gura b) se ha usado subdivisin adaptativa. En cada paso, se ha elegido o

29

como plano de corte aqul que divide la regin de tal forma que a cada lado e o del plano existan el mismo nmero de objetos. Esto produce un arbol BSP u ms balanceado en el que la lngitud mxima de bsqueda se ha reducido a a o a u 4.

Figure 26

Вам также может понравиться