Trabajo A2 1

"“Año de la consolidación del Mar de Grau” Facultad de Ingeniería Tema: Curvas de Bézier Curso: Análisis Matemático

Views 13 Downloads 0 File size 821KB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

"“Año de la consolidación del Mar de Grau”

Facultad de Ingeniería

Tema:

Curvas de Bézier

Curso:

Análisis Matemático II

Profesora: Leo Guerrero Alumnos:    

Adrianzen Zurita Fátima García García Luis Macalupu Sandoval Cesar Palacios Vilchez Marco

Grupo:

16

Sección:

“D”

Fecha:

30-03-2016

´ ZIER CURVAS DE BE Las curvas de Bézier se utilizan en el diseño asistido por computadora y deben su nombre al matemático francés Pierre Bézier (1910-1999), quien trabajó en la industria automotriz. Una curva de Bézier cúbica está determinada por cuatro puntos de control, P0(x0,y0), P1(x1,y1), P2(x2,y2), P3(x3,y3), y está definida por las ecuaciones paramétricas x = x0(1−t)3 + 3x1t(1−t)2 + 3x2t2(1−t) + x3t3, y = y0(1−t)3 + 3y1t(1−t)2 + 3y2t2(1−t) + y3t3, donde 0 ≤ t ≤ 1. Notar que cuando t = 0 tenemos (x,y) = (x 0,y0) y cuando t = 1 tenemos (x,y) = (x3,y3), de modo que la curva comienza en P 0 y termina en P3. Teniendo en cuenta los datos anteriores, procedemos al desarrollo del informe. a) Graficar la curva de Bézier con puntos de control P0 (4,1), P1 (28,48), P2 (50,42) y P3(40,5). Luego en la misma ventana dibuje los segmentos de recta P0 P1, P1 P2 y P2 P3. Notar que los puntos de control intermedios P1 y P2 no se encuentran en la curva; la curva comienza en P0, se dirige hacia P1 y P2 sin alcanzarlos y termina en P3. CÓDIGOS (PYTHON): # -*- coding: utf-8 -*-""" ''' el primer paso es importar las librerías como se trata de una gráfica de dos dimensiones solo se necesitan dos librerías las cuales son numpy y matplorlib''' 'asignar numpy=np' import numpy as np import matplotlib.pyplot as plt '''definimos las dimensiones que van a tener la figura resultante final es una proporción no hay dimensiones exactas como centímetros o pulgadas, la primera dimensión se refiere al ancho y la segunda dimensión el largo''' 'al mencionar plt llamamos a la libreria plt' fig = plt.figure(figsize=(10, 5)) ax = fig.add_subplot(111) '''Esta línea es para determinar una gráfica dentro de la figura que establecimos en la línea anterior''' '''Radio del circulo que usaremos para un cicloide''' '-en que intervalo voy a trabajar y en cuentas partes voy a dividir' t = np.linspace(0, 1, 100) ''' Rango del ángulo de giro que usaremos para graficar el cicloide, la función tiene tres argumentos o valores que deben incluirse el primero es el valor inicial, el segundo el valor final y el tercero es la cantidad de divisiones'''

x = 4*(1-t)**3 + 84*t*(1-t)**2 +150*(t**2)*(1-t) + 40*(t**3) '''Es el valor de x en función de t que es nuestro parámetro''' y = 1*(1-t)**3 + 144*t*(1-t)**2 +126*(t**2)*(1-t) + 5*(t**3) '''Es el valor de y en función de t''' 'top=no se va a ver la linea' ax.spines['top'].set_color('none') ax.spines['right'].set_color('none') '''Estas líneas evitan que al lado derecho y en la parte superior se muestren los ejes poniéndoles un color nulo''' 'bottom=al fondo' 'en el eje y los numeros van a estar a la izquierda' ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') '''Ubicamos los valores que aparecen en la recta debajo de la recta en el eje x y a la izquierda en la recta del eje y''' '''ax.spines['left'].set_position('center')''' ''' Ubicamos el eje y en el centro de la gráfica''' ax.plot(x, y,'r',linewidth="2") '''Definimos las coordenadas de la gráfica, el color que la línea va a tener y el ancho de la línea''' ax.set_xlim(0,50) '''definimos los límites de la gráfica en el eje x''' ax.set_ylim(0,50) '''definimos los límites de la gráfica en el eje y''' ax.set_xlabel('$eje x$',fontsize = 18) #Nombramos el eje X ax.set_ylabel('$eje y$',fontsize = 18) #Nombramos el eje Y '''definimos los puntos de control''' '''Punto 0''' x0 = 4 y0 = 1 '''Punto 1''' x1 = 28

y1 = 48 '''Punto 2''' x2 = 50 y2 = 42 '''Punto 3''' x3 = 40 y3 = 5 verts = [(x0, y0),(x1, y1),(x2, y2),(x3,y3)] xs, ys = zip(*verts) 'punto significa asterisco' ax.plot(xs, ys, '.--', lw=2, color='orange', ms=18) 'lw grosor de linea, ms tamaño de los puntos' ax.text(4, -0.04, 'P0') ax.text(29, 48, 'P1') ax.text(46, 47, 'P2') ax.text(40, 8, 'P3') plt.show() GRÁFICA:

B) En el dibujo de la parte 1 parece que la recta tangente en P0 pasa por P1 y la recta tangente en P3 pasa por P2. Pruebe que esto es así. Evaluamos analíticamente: Caso 1 x = x0(1−t)3 + 3x1t(1−t)2 + 3x2t2(1−t) + x3t3, y = y0(1−t)3 + 3y1t(1−t)2 + 3y2t2(1−t) + y3t3, X’(t)= -90𝑡 2 -12t+72 Y’(t)= 66𝑡 2 -318t+141 Ahora evaluamos en t = 0 X’ (0) = 72 Y’ (0) = 141 Entonces la derivada de h’ (0) cuando t = 0 h’ (0) = (72,141) Luego tomamos como referencia P0 = (4,1) como punto de paso de los dos puntos y como vector dirección la derivada de tal manera que al multiplicarlo por un escalar pueda formarse la ecuación de la recta que queremos. L0 = (4,1) + c (72,141) Le damos la forma: Y= mx +b X=4+72c

C

Y=1+141c

x4 72

y=1+141 (

x4 ) 72

Tenemos que: y

141x 492  72 72

Entonces luego de desarrollar de hallar un Y, podemos comprobar X remplazando el primer punto de control en Y el cual es P1(28,48). Remplazando x=28 en la ecuación dada tenemos que: Y=47 Podemos concluir que la recta P0 si pasa por P1 Evaluamos analíticamente: Caso 2 x = x0(1−t)3 + 3x1t(1−t)2 + 3x2t2(1−t) + x3t3, y = y0(1−t)3 + 3y1t(1−t)2 + 3y2t2(1−t) + y3t3, X’(t)= -90𝑡 2 -12t+72

Y’(t)= 66𝑡 2 -318t+141 Ahora evaluamos en t = 0 X’ (0) = 72 Y’ (0) = 141 Entonces la derivada de h’ (0) cuando t = 0 h’ (0) = (72,141) Luego tomamos como referencia P4 = (40,5) como punto de paso de los dos puntos y como vector dirección la derivada de tal manera que al multiplicarlo por un escalar pueda formarse la ecuación de la recta que queremos. L0 = (40,5) + c (72,141) Le damos la forma: X=40+72c

Y=mx +b

C

x  40 72

Y=5+141c

y=5+141 (

x  40 ) 72

Tenemos que: y

141x 5640  72 72

Entonces luego de desarrollar de hallar un Y, podemos comprobar X remplazando el primer punto de control en Y el cual es P2 (50,42) Remplazando x = 50 en la ecuación dada tenemos que: Y=15 Podemos concluir que la recta P3 si pasa por P2. CÓDIGOS (PYTHON) # -*- coding: utf-8 -*''' el primer paso es importar las librerías como se trata de una gráfica de dos dimensiones solo se necesitan dos librerías las cuales son numpy y matplorlib''' import numpy as np import matplotlib.pyplot as plt '''definimos las dimensiones que van a tener la figura resultante final es una proporción no hay dimensiones exactas como centímetros o pulgadas, la primera dimensión se refiere al ancho y la segunda dimensión el largo''' fig=plt.figure(figsize=(10,5))

ax= fig.add_subplot(111) t=np.linspace(0,1,100) '''definimos los puntos de control''' ''' Punto 0''' x0=4 y0=1 ''' Punto 1 ''' x1=28 y1=48 '''Punto 2 ''' x2=50 y2=42 ''' Punto 3 ''' x3=40 y3=5 verts= [(x0,y0),(x1,y1),(x2,y2),(x3,y3)] xs,ys=zip(*verts) ax.plot(xs,ys,'.-',lw=2, color='brown',ms=15) ax.text(4.5,4,'P0') ax.text(28,49, 'P1') ax.text(47.5,41.7, 'P2') ax.text(40.3,5, 'P3') x=x0*((1-t)**3)+3*x1*t*((1-t)**2)+3*x2*(t**2)*(1-t)+x3*(t**3) y=y0*((1-t)**3)+3*y1*t*((1-t)**2)+3*y2*(t**2)*(1-t)+y3*(t**3) t1=0 t2=1 mx0=-3*x0*((1-t1)**2)+3*x1*(((1-t1)**2)-(2*t1)*(1-t1))+3*x2*((2*t1)*(1-t1)(t1**2))+3*x3*(t1**2) my0=-3*y0*((1-t1)**2)+3*y1*(((1-t1)**2)-(2*t1)*(1-t1))+3*y2*((2*t1)*(1-t1)(t1**2))+3*y3*(t1**2) mx3=-3*x0*((1-t2)**2)+3*x1*(((1-t2)**2)-(2*t2)*(1-t2))+3*x2*((2*t2)*(1-t2)(t2**2))+3*x3*(t2**2)

my3=-3*y0*((1-t2)**2)+3*y1*(((1-t2)**2)-(2*t2)*(1-t2))+3*y2*((2*t2)*(1-t2)(t2**2))+3*y3*(t2**2) r=np.linspace(-20,100,500) tgx0=x0+r*mx0 tgy0=y0+r*my0 tgx3=x3+r*mx3 tgy3=y3+r*my3 ax.spines['top'].set_color('none') ax.spines['right'].set_color('none') ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') ax.plot(x,y,'-r',linewidth='2') ax.plot(tgx0,tgy0,'-g',linewidth='2') ax.plot(tgx3,tgy3,'-y',linewidth='2') ax.set_xlim(3, 50) ax.set_ylim(-2,49) ax.set_xlabel('$x$',fontsize=18) ax.set_ylabel('$y$',fontsize=18) plt.show() plt.savefig("UnirPuntos.pdf",format='pdf') GRÁFICA:

C) Encuentre la parametrización de la evoluta de la curva de Bézier dada y dibújela.

D) Trate de producir una curva de Bézier con un bucle cambiando el segundo punto de control de la parte 1 # -*- coding: utf-8 -*-""" ''' el primer paso es importar las librerías como se trata de una gráfica de dos dimensiones solo se necesitan dos librerías las cuales son numpy y matplorlib''' 'asignar numpy=np' import numpy as np import matplotlib.pyplot as plt '''definimos las dimensiones que van a tener la figura resultante final es una proporción no hay dimensiones exactas como centímetros o pulgadas, la primera dimensión se refiere al ancho y la segunda dimensión el largo''' 'al mencionar plt llamamos a la libreria plt' fig = plt.figure(figsize=(10, 5)) ax = fig.add_subplot(111) '''Esta línea es para determinar una gráfica dentro de la figura que establecimos en la línea anterior''' '''Radio del circulo que usaremos para un cicloide''' '-en que intervalo voy a trabajar y en cuentas partes voy a dividir' t = np.linspace(0, 1, 100) ''' Rango del ángulo de giro que usaremos para graficar el cicloide, la función tiene tres argumentos o valores que deben incluirse el primero es el valor inicial, el segundo el valor final y el tercero es la cantidad de divisiones''' x = 4*(1-t)**3 + 306*t*(1-t)**2 +150*(t**2)*(1-t) + 40*(t**3) '''Es el valor de x en función de t que es nuestro parámetro''' y = 1*(1-t)**3 + 129*t*(1-t)**2 +126*(t**2)*(1-t) + 5*(t**3) '''Es el valor de y en función de t''' 'top=no se va a ver la linea' ax.spines['top'].set_color('none') ax.spines['right'].set_color('none')

'''Estas líneas evitan que al lado derecho y en la parte superior se muestren los ejes poniéndoles un color nulo''' 'bottom=al fondo' 'en el eje y los numeros van a estar a la izquierda' ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') '''Ubicamos los valores que aparecen en la recta debajo de la recta en el eje x y a la izquierda en la recta del eje y''' '''ax.spines['left'].set_position('center')''' ''' Ubicamos el eje y en el centro de la gráfica''' ax.plot(x, y,'r',linewidth="2") '''Definimos las coordenadas de la gráfica, el color que la línea va a tener y el ancho de la línea''' ax.set_xlim(0,120) '''definimos los límites de la gráfica en el eje x''' ax.set_ylim(0,600) '''definimos los límites de la gráfica en el eje y''' ax.set_xlabel('$eje x$',fontsize = 18) #Nombramos el eje X ax.set_ylabel('$eje y$',fontsize = 18) #Nombramos el eje Y '''definimos los puntos de control''' '''Punto 0''' x0 = 4 y0 = 1 '''Punto 1, tenemos que cambiarlo porque asi nos pide el apartado''' x1 = 102 y1 = 43 '''Punto 2''' x2 = 60 y2 = 42 '''Punto 3''' x3 = 40 y3 = 5

verts = [(x0, y0),(x1, y1),(x2, y2),(x3,y3)] xs, ys = zip(*verts) 'punto significa asterisco' ax.plot(xs, ys, '.--', lw=2, color='orange', ms=18) 'lw grosor de linea, ms tamaño de los puntos' ax.text(4, -0.04, 'P0') ax.text(104, 42, 'P1') ax.text(46, 47, 'P2') ax.text(40, 8, 'P3') plt.show()

E) Algunas impresora láser utilizan curvas de Bézier para representar letras y otros símbolos. Experimente con varios puntos de control hasta que se encuentre una curva de Bézier que represente de manera razonable la letra C # -*- coding: utf-8 -*''' el primer paso es importar las librerías como se trata de una gráfica de dos dimensiones solo se necesitan dos librerías las cuales son numpy y matplorlib''' import numpy as np import matplotlib.pyplot as plt '''definimos las dimensiones que van a tener la figura resultante final es una proporción no hay dimensiones exactas como centímetros o pulgadas, la primera dimensión se refiere al ancho y la segunda dimensión el largo'''

fig=plt.figure(figsize=(10,5)) ax= fig.add_subplot(111) t=np.linspace(0,1,100) ''' probamos punto por punto hasta llegar a la forma C que nos piden''' ''' Punto 0''' x0=33 y0=15 ''' Punto 1 ''' x1=23 y1=5 '''Punto 2 ''' x2=23 y2=39 ''' Punto 3 ''' x3=33 y3=31 verts= [(x0,y0),(x1,y1),(x2,y2),(x3,y3)] xs,ys=zip(*verts)

ax.plot(xs,ys,'.--',lw=2, color='skyblue',ms=15) ax.text(34,14,'P0') ax.text(25,3, 'P1') ax.text(26,43, 'P2') ax.text(35,33, 'P3')

x=x0*((1-t)**3)+3*x1*t*((1-t)**2)+3*x2*(t**2)*(1-t)+x3*(t**3) y=y0*((1-t)**3)+3*y1*t*((1-t)**2)+3*y2*(t**2)*(1-t)+y3*(t**3) ax.spines['top'].set_color('none') ax.spines['right'].set_color('none') ax.xaxis.set_ticks_position('bottom')

ax.yaxis.set_ticks_position('left') ax.plot(x,y,'-r',linewidth='2') ax.set_xlim(3, 52) ax.set_ylim(-2,50) ax.set_xlabel('$x$',fontsize=18) ax.set_ylabel('$y$',fontsize=18) plt.show() plt.savefig("UnirPuntos.pdf",format='pdf') GRAFICA:

F) Se pueden representar formas más complicadas piezando dos o más curvas de Bézier. Suponga que la primera curva de Bézier tiene puntos de control P0, P1, P2, P3 y la segunda tiene puntos de control P3, P4, P5, P6. Si queremos unir estas dos partes suavemente, entonces, las tangentes en P3 deben coincidir y, por lo tanto, los puntos P2, P3 y P4 tienen que estar sobre esta tangente común. Utilizando este principio, encuentre puntos de control para un par de curvas de Bézier que representen la letra S.