Diseño Geométrico por Computadora De la Visión al Diseño M. Sirvent Departamento de Ingeniería y Ciencias, Tecnológico de Monterrey, Campus León, León, Gto. 37160, México, [email protected] Resumen. El profesor Gerald Farin de la universidad del estado de Arizona dijo acertadamente que la decisión de usar computadoras en el proceso de diseño automáticamente obliga al diseñador a describir las formas en términos matemáticos. Cuando una curva o una superficie se representa matemáticamente, como se hace en el diseño geométrico por computadoras, una manera eficiente de hacerlo es utilizando splines. En este artículo daremos una introducción a estos objetos llamados splines, a las matemáticas atrás de ellos y algunas de sus interesantes aplicaciones. 1. Introducción Anteriormente, para diseñar objetos, algo que se solía hacer era modelar con arcilla y se experimentaba hasta tener algo que se aproximara a lo que teníamos en mente, otra cosa que se hacía era utilizar plantillas tanto para modelar algo que ya existía como para generar nuevos diseños. El estudio de los splines comenzó alrededor de 1940, aplicaciones prácticas realmente empezaron hasta más tarde, cuando las computadoras se hicieron lo suficientemente eficientes y rápidas, a partir de ese momento, se convirtieron en una herramienta imprescindible. El problema principal para el diseño consistía en elaborar algoritmos que resolvieran lo siguiente: Dados un cierto número de puntos, encontrar una curva suave, que pase por esos puntos dados, o si no pasa por ellos, que aproxime a los datos dados. Varios matemáticos e ingenieros trabajaron y ofrecieron soluciones a este problema, por mencionar a algunos de ellos, tenemos: en Estados Unidos se encontraba el diseñador James Ferguson. Ferguson trabajaba en la industria aeronáutica como diseñador de aviones. En Francia el ingeniero Paul De Casteljau desarrolló un algoritmo, conocido como el algoritmo de De Casteljau, el cual es fundamental en esta área de diseño de curvas, es un algoritmo sencillo y poderoso. De Casteljau desarrolló este algoritmo en 1959 cuando trabajaba en Citroen, pero no se conoció su trabajo hasta años mas tarde, cuando Boehm obtuvo copias de sus reportes en 1975. Pierre Bézier, matemático e ingeniero francés también hizo grandes aportaciones al respecto, el trabajaba en la Renault. El trabajo de Ferguson precedió al de De Casteljau y al de Bézier, así como el de De Casteljau precedió al de Bézier, ninguno de ellos conocía el trabajo de los otros, debido a que las industrias en las que trabajaban, tenían estos resultados como secretos industriales. Los trabajos se publicaron hasta más tarde. 2. ¿Qué tienen en común las siguientes situaciones? : 2.1 Problemas de Planteo. Usualmente los problemas de planteo que nos encontramos en los libros de texto son un poco artificiales, empiezan con una historia en la que quizá tengamos que maximizar utilidades, minimizar costos, minimizar cantidad de material, maximizar volumen, etc., después de la poesía, nos dan la función, y listo, empezamos con nuestro proceso. En la vida real, por lo general la función no va a estar dada, tendremos datos discretos, entonces la pregunta natural surge: dados n puntos, cómo encontrar una función que pase por ellos, o que aproxime a los datos dados. 2.2 Impresoras láser. Cuando imprimimos en una impresora láser un texto que hemos escrito usando una computadora, por lo general lo hacemos sin cuestionarnos como se logra la comunicación de la computadora a la impresora, de tal manera, que los símbolos que hemos usado se reproduzcan fielmente en la impresión. Si las letras se guardan como una sucesión de pixeles, uno de los problemas con los que uno se encuentra, es que al querer cambiarle el tamaño, la letra se distorsiona, una mejor manera, es guardar cada letra como una sucesión de curvas, es decir, dada una letra, se divide en varios pedazos y entonces, dados n puntos, se encuentra una curva suave que aproxima a esos puntos, cada letra es guardada como una sucesión de curvas, la impresora usa un lenguaje gráfico, como por ejemplo PostScript, que es un lenguaje orientado a objetos para leer estas sucesiones de curvas y reproducirlas de manera suave. 2.3 El Perfil de un automóvil o de las alas de un avión. Para el diseño del perfil de un automóvil o el de las alas de un avión, el poder modelarlos en una computadora ha sido de gran utilidad, podemos variar nuestro modelo, agrandarlo, reducirlo, rotarlo, trasladarlo, hacer cambios locales, en fin, tenemos más flexibilidad en el diseño y además de que el resultado es bueno, el costo es bajo. Para lograr estos diseños, uno se pregunta, dados n puntos, ahora quizá en el espacio, como encontrar una superficie que pase o aproxime a los datos dados. 2.4 Creando animaciones. Al ver la película “terminator 2”, uno llega al cine pensando en ver simplemente la segunda parte de una película que algunos de nosotros consideramos buena, y nos llevamos una grata sorpresa, al darnos cuenta de que la película no solamente es otra vez interesante, sino que además nos impresionamos con los efectos especiales, el ver como una forma se transforma en otra, ahí delante de nosotros, en la pantalla y de manera bastante suave, es algo fantástico, entonces uno se pregunta en cómo esto se ha podido lograr, es decir, dadas dos formas, diferentes entre sí, como encontrar una sucesión de transformaciones suaves que nos lleven de una forma a la otra, algo que uno quizá pueda hacer, por supuesto hablando a muy grandes rasgos es, guardar cada una de las formas originales como una sucesión de curvas o superficies, y entonces transformar una en la otra mediante una sucesión de formas de tal manera que cada punto transformado realice una curva suave. Cada una de las situaciones presentadas, tienen en común que su solución utiliza curvas y superficies conocidas como Splines. Nosotros nos centraremos en la parte de curvas. Para definir Splines, primero hablaremos del algoritmo de De Casteljau y curvas de Bézier y entonces estaremos listos para definir lo que es un Spline. 3. Algoritmo de De Casteljau: Dados b0 , b1 ,...,bn R 3 y t R definimos: bi (t ) (1 t )bi r r 1 r 1 (t ) tbi1 (t ) r 1,...,n ; i 0,...,n r bi (t ) bi 0 Entonces n b0 (t ) es el punto con valor paramétrico t que está en la curva b n A la curva generada con este algoritmo se le conoce como curva de Bézier. (3.1) A los puntos b0 , b1 ,...,bn se les denomina puntos de control y al polígono formado por ellos, el polígono de control de la curva. A continuación se da un ejemplo de cómo generar una curva de Bézier de grado tres, tanto de manera algebraica como de manera geométrica: 3.1 Curva de Bézier de grado 3. Forma algebraica: Dados b0 , b1 , b2 , b3 , encontrar la curva de grado 3 que generan estos puntos de control: Aplicando el algoritmo de De Casteljau, obtenemos: b0 (t ) (1 t )b0 tb1 1 b1 (t ) (1 t )b1 tb2 1 b2 (t ) (1 t )b2 tb3 1 b0 (t ) (1 t )b0 tb11 2 1 b12 (t ) (1 t )b11 tb21 b03 (t ) (1 t )b02 (t ) tb12 (t ) Insertando las dos primeras ecuaciones en la cuarta y la segunda y la tercera en la quinta, obtenemos: b02 (t ) (1 t ) 2 b0 2(1 t )tb1 t 2 b2 b12 (t ) (1 t ) 2 b1 2(1 t )(t )b2 t 2 b3 3 Ahora insertando estas dos ecuaciones en la ecuación para b0 (t ) nos queda: b03 (t ) (1 t ) 3 b0 3(1 t ) 2 tb1 3(1 t )t 2b2 t 3b3 Por lo tanto la curva que hemos obtenido es un polinomio de grado 3 en la variable t. En otras palabras, esta es la curva de Bézier de grado tres generada por los cuatro puntos de control dados. 3.2 Curva de Bézier de grado 3. Forma geométrica: El punto b03 (t ) está en la curva de Bézier, variando el valor de t, obtenemos todos los puntos de la curva. n En general, no es difícil demostrar, que dados n+1 puntos de control, la curva de Bézier b generada usando el algoritmo de De Casteljau es un polinomio en la variable t de grado n. La curva de Bézier interpola al primer y último puntos de control, no interpola a los demás, pero la curva queda dentro de la envolvente convexa definida por el polígono de control, además la curva imita la forma de este polígono. Esta es una herramienta poderosa para diseñar curvas en general, lo que tenemos que hacer, es dar puntos de control que imiten la forma de la curva que queremos obtener. 4. Polinomios de Bernstein: Es conveniente para el análisis teórico y también práctico, proporcionar una base para las curvas de Bézier. Es decir, una representación explícita de estas curvas. Una base natural son los polinomios de Bernstein. n Bin (t ) t i (1 t ) ni i No es difícil demostrar que la curva de Bézier de grado n se puede expresar como sigue: n b n (t ) b nj B j (t ) j 0 5. Splines Si la curva que queremos reproducir es un poco compleja, lo más seguro es que necesitemos una curva de Bézier de grado grande, pero eso no es recomendable, ya que un polinomio de grado alto suele tener oscilaciones, por lo que entonces conviene hacer uso de lo que se conoce como Splines, es decir, curvas que son polinomios por pedazos (curvas de Bézier) y que sean globalmente un cierto números de veces diferenciable. Es decir, queremos una curva que en cada pedazo sea una curva de Bézier y que en los puntos de encuentro con las otras curvas, este sea suave. Splines son las curvas de Bézier por pedazos. Estamos interesados en dar el mínimo número de puntos de control que generarán a toda la curva, es decir, nos interesa encontrar una base que genere al espacio de los Splines, elegida la base, a los Splines se les llama B-Splines. 6. B-Splines Una base para los Splines: N ip (u) ui p1 u u ui N ip 1 (u) N ip11 (u) ui p ui ui p 1 ui 1 N i0 (u) 1 si ui u ui 1 y 0 en cualquier otro caso Por lo tanto, dados n+1 puntos de control b0 , b1 ,...,bn , el B-spline de grado n definido por estos puntos y En donde subintervalos está dado como sigue: n C (u ) N ip (u )bi i 0 Los B-Splines son curvas polinomiales por pedazos, flexibles y con propiedades muy interesantes, una de las más importantes es que se tiene control local de la forma de la curva, es decir, si cambiamos uno de los puntos de control, solamente una parte de la curva cambiará. 7. Un par de ejemplos a continuación: 7.1 En mi curso de cálculo, el problema que tenían que resolver mis alumnos, era, yo les daba un foco (el mismo a cada equipo) y ellos tenían que usar cálculo para calcular su volumen, el que aproximara mejor este valor, obtenía la máxima calificación y así se iba calificando. Pero cómo comparar sus resultados si este no es un problema en donde podamos ver la solución al final del libro, además la solución depende del foco. Por lo que hice un perfil del foco usando splines, y después calcular su volumen. El problema es, dados los siguientes datos: (0,0.63),(0.55,0.68),(1.05,0.82),(1.53,1.08),(2.1,1.36),(2.54,1.42), (2.92,1.34),(3.3,1.14),(3.7,0.8) Encontrar una función que sea suave y que pase por todos los puntos, la solución que damos a continuación es, se construye un polinomio cúbico en cada segmento de tal manera que en cada pedazo, las curvas se unan de manera suave, es decir, construimos un spline cúbico: 7.2 En el siguiente ejemplo, se muestra el diseño de la letra e, usando primero muchos puntos de control y en el segundo, se utiliza el número óptimo para diseñar la letra, se utilizan splines cúbicos en el diseño. Se observa que el diseño usando el número óptimo de puntos se superior al que usa muchos. Por lo que la elección de una base para los splines cúbicos es importante. Este dibujo fue tomado de la siguiente página. http://inicia.es/de/jmas/fontcreation1.html En las siguientes ligas se pueden encontrar unos applets interesantes de curvas de Bézier: http://www.math.ucla.edu/~baker/java/hoefer/Bezier.htm http://www.cse.unsw.edu.au/~lambert/splines/Bezier.html BIBLIOGRAFÍA Farin Gerald, “Curves and Surfaces for CAGD. A Practical Guide”. Academic Press, Inc. 3a. ed. 1993 Alfeld P., Schumaker L., Sirvent M., “On Dimension and Existence of Local Bases for Multivariate Spline Spaces”, Journal of Approximation Theory, vol. 70, No. 2, Agosto 1992.