Curvas de Bézier - Aplicación práctica en Java

download Curvas de Bézier - Aplicación práctica en Java

of 63

Transcript of Curvas de Bézier - Aplicación práctica en Java

Curvas de BzierAplicacin prctica en Java

Jorge Torregrosa LloretEscuela Politcnica Superior Grado Ing. Multimedia

1

2

Curvas de BzierAplicacin prctica en Java

Jorge Torregrosa LloretEscuela Politcnica Superior Universidad Alicante

3

4

ndice1. Introduccin 2. Polinomios de Bernstein.2.1 Introduccin.. 2.2 Definicin.. 2.3 Ejemplos de polinomios de Bernstein 2.4 Propiedades polinomios de Bernstein 2.5 Anexo de programacin. 2.6 Sabas que .

7 99 9 10 13 17 19

3. Curvas de Bzier.3.1 Introduccin.. 3.2 Definicin.. 3.3 Ejemplos de curvas de Bzier 3.4 Propiedades curvas de Bzier 3.5 Propiedad recursiva de las curvas de Bzier. 3.6 Derivadas de curvas de Bzier.. 3.7 Elevacin de grado 3.8 Curvas de Bzier racionales... 3.9 Anexo de programacin. 3.10 Sabas que .. 4. Algoritmo de Casteljau... 4.1 Introduccin... 4.2 Definicin.. 4.3 Ejemplos Casteljau. 4.4 Anexo de programacin. 4.5 Sabas que .

2121 21 22 29 31 32 34 36 37 45

4848 48 50 52 61

5

6

1. IntroduccinA lo largo de estos apartados trataremos de explicar las caractersticas bsicas de las curvas de Bzier, as como los mtodos para obtenerlas. Pero claro, ahora surgir tpica pregunta, curvas de Bezi qu? Las curvas de Bzier son un sistema que se desarrollo sobre 1960 para realizar dibujos tcnicos en el mbito profesional. Su nombre es en honor de quin ide un mtodo de descripcin matemtica de las curvas, Pierre Bzier. A continuacin una ilustracin de lo que es una curva de Bzier:

Como podemos observar, las partes ms importantes son los nodos de inicio y final (b0 y b3) y los puntos de control mediante los cuales podemos modificar la forma de la curva. Las curvas de Bzier han sido abundantemente usadas en grficos para ordenador, CAD, dibujo tcnico, etc. Como la curva est completamente contenida en la envolvente convexa de los puntos de control, estos puntos pueden visualizarse grficamente sobre un rea de trabajo. Podemos observar como muchos de los programas de diseo incorporan estas curvas como Pluma, Lpiz, Trazados Bzier, etc. en su interfaz. Adobe Illustrator, Inkscape o Gimo, entre otros, las incorporan. Vemos en la imagen de al lado como una sucesin de curvas de Bzier pueden definir el contorno de una figura.

7

Al final de algunos apartados incluiremos algn ejemplo de cdigo til en java, con el fin de aadir una parte ms prctica a toda la teora de Bzier. Aunque hay que aadir que estos cdigos pueden estar ms o menos depurados, eficientes y elegantes. La perfeccin de este cdigo se amoldar a los conocimientos de 1 de Grado en Ing. Multimedia.

8

2. Polinomios de Bernstein2.1 Introduccin Sergi Natnovich Bernstin (n. 5 de marzo de 1880 en Odessa - Ucrania, Imperio ruso - 26 de octubre de 1968 en Mosc) era un importante matemtico. Estudi de 1899 a 1904 en la Sorbonne (Sorbona) de Pars y en la cole suprieure d'lectricit (Escuela superior de electricidad) obteniendo el doctorado en 1904. En Rusia realiz un curso para revalidar los estudios en Francia y para obtener los diplomas que le daban derecho a ensear. A partir de 1907, dio clases en la universidad de la ciudad de Jrkov en Ucrania, all se recibi de doctor en matemticas en el ao 1913. Seguidamente dio enseanza en Leningrado y en Mosc. Su tesis de doctorado presentada en la Sorbona en 1904 resolva el 19 problema de Hilbert. Los trabajos de S. Bernstin llevaron a la aproximacin de las funciones y la teora de las probabilidades. es.wikipedia.org

2.2 Definicin Los polinomios de Bernstein son una clase especial de polinomios en el campo de los nmeros reales. Son bastante utilizados en el mbito del anlisis numrico. El algoritmo de evaluacin ms numricamente estable es el de Casteljau, el cual estudiaremos en posteriores captulos. Estos polinomios tienen un papel clave en la definicin de una curva de Bzier, puesto que estos forman parte de la frmula que la compone. Definimos los polinomios de Bernstein como:

9

Vemos como esta definicin est compuesta por nmeros combinatorios. Como recordatorio, aadiremos que o nmero combinatorio se representa como:

Y se desarrolla de la siguiente manera:

Estos peculiares nmeros se caracterizan por seguir una serie de propiedades que enunciaremos a continuacin: Los nmeros de este tipo se llaman complementarios

A continuacin visualizaremos grficamente dichos polinomios. Mostraremos como ejemplo los polinomios de grado n=2, n=3 y n=4.

2.3 Ejemplos de polinomios de Bernstein Polinomios de Bernstein de grado 2 Nos ayudaremos de un software de representacin grfica como puede ser Geogebra para ilustrar los ejemplos.

10

Polinomios de Bernstein de grado 3 Sin duda se tratan de los polinomios ms utilizados. Nos ayudaremos de un software de representacin grfica como puede ser Geogebra para ilustrar los ejemplos.

11

Polinomios de Bernstein de grado 4

12

2.4 Propiedades polinomios de Bernstein Para un grado n, existen n+1 polinomios de Bernstein definidos sobre el intervalo [a,b], por:

Estos polinomios presentan estas propiedades importantes, que cumplen cualquier valor de u en el intervalo [a,b] Particin de la unidad:

Comprobacin: Supongamos que tenemos los polinomios de Bernstein de grado 2:

Ahora los sumamos todos:

Positividad:

Comprobacin: Supongamos que tenemos los polinomios de Bernstein de grado 2:

Visualizando la grfica de los polinomios, observamos que en el intervalo [0,1], siempre son positivos:

13

Simetra:

Demostracin: Geogebra nos permite visualizar de manera grfica los polinomios. Poniendo como ejemplo dos polinomios, observamos que :

Son simtricos respecto x=1/2:

14

Son simtricos x=1/2:

Al cumplirse las propiedades de Particin de la unidad y Positividad, podemos decir que forman una combinacin convexa. Una combinacin convexa es una combinacin lineal de puntos donde todos los coeficientes son no-negativos y suman 1.

Gran semejanza de estos polinomios con la distribucin binomial. La distribucin binomial es una distribucin de probabilidad discreta que mide el nmero de xitos en una secuencia de n ensayos independientes de Bernoulli con una probabilidad fija p de ocurrencia del xito entre los ensayos. La binomial posee la siguiente funcin de probabilidad:

Comparada con la de los polinomios de Bernstein:

Sus nicas races son 0 y 1. Comprobacin:15

Pondremos como ejemplo los polinomios de grado 2 por su sencillez:

Son linealmente independientes. Comprobacin: Pondremos como ejemplo los polinomios de grado 2 por su sencillez:

Son linealmente independientes

Satisfacen la relacin de recurrencia:

Cada polinomio de Bernstein tiene un nico mximo, que se alcanza en . As que si se modifica el valor de bi, la curva de Bzier sufre su mayor variacin en .

16

3.5 Anexo de programacin Como bien ya se ha descrito anteriormente, el lenguaje a utilizar ser Java. A continuacin describiremos la implementacin del algoritmo para mostrar los resultados de los polinomios de Bernstein.

Clase Bernsteinimport java.io.BufferedReader; import java.io.InputStreamReader; public class Bernstein { //Devuelve un array de Strings, cada posicin es un polinomio. public static String[] CalculoBernstein(int grado) { if (grado != 0) { int m = grado, n = 0; String[] resultado = new String[grado + 1]; for (int i = 0; i < grado + { resultado[i] = "B(" + m long comb = comb(m, n); if (comb != 1) resultado[i] += "(" if (n != 0) { if (n == 1) resultado[i] += else resultado[i] += } if (m - n != 0) { 1; i++) + "," + n + "): + comb; ";

"u"; "u^" + n;

17

if (m - n == 1) if (comb == 1) resultado[i] += "(1-u)"; else resultado[i] += ")*(1-u)"; else if (n == 0) resultado[i] += "(1-u)^" + (m - n); else resultado[i] += ")*(1-u)^" + (m - n); } n++; } return resultado; } else return null; } //Devuelve el resultado del numero combinatorio indicado public static long comb(int n, int i) { return fact(n) / (fact(i) * fact(n - i)); } //Realiza el factorial de un numero de forma recursiva public static long fact(int n) { if (n == 0) return 1; else return n * fact(n - 1); } public static void main(String[] args) { String[] aux = new String[0]; String s = ""; try { BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

System.out.println("Inserta el grado de Polinomio de Bernstein deseado(