Diferencia entre revisiones de «Curvas de Bézier Grupo 2»
(→Aplicación de una curva de Bézier al tramo de un circuito de F_1.) |
(→Código y representación) |
||
| (No se muestran 219 ediciones intermedias de 4 usuarios) | |||
| Línea 17: | Línea 17: | ||
| − | ==Representación de la curva de Bézier cúbica para <math>n=3</math>, junto con la curva poligonal que conecta cuatro puntos de control coplanarios. == | + | =='''Representación de la curva de Bézier cúbica para <math>n=3</math>, junto con la curva poligonal que conecta cuatro puntos de control coplanarios.''' == |
| − | En primer lugar | + | En primer lugar se seleccionan cuatro puntos de control coplanarios (<math>P_0,P_1,P_2,P_3</math>): |
<br/><math> \;\left\{\begin{matrix}P_0=(0,0) \\ P_1=(4,2) \\ P_2=(0,2) \\ P_3=(4,4) \end{matrix}\right.</math> | <br/><math> \;\left\{\begin{matrix}P_0=(0,0) \\ P_1=(4,2) \\ P_2=(0,2) \\ P_3=(4,4) \end{matrix}\right.</math> | ||
| − | Para calcular los puntos de la curva se utilizan los polinomios de Bernstein para cada valor de <math>n</math>: | + | Para calcular los puntos de la curva se utilizan los polinomios de Bernstein para cada valor de <math>i∈</math> <big>{</big> <math>0,1,2,...,n</math> <big>}</big> con <math>n=3</math>: |
<math> B_0=(1-t)^3 </math> | <math> B_0=(1-t)^3 </math> | ||
| Línea 36: | Línea 36: | ||
Se calcula la posición del punto en la curva mediante una combinación lineal de los puntos de control ponderados por los polinomios de Bernstein. | Se calcula la posición del punto en la curva mediante una combinación lineal de los puntos de control ponderados por los polinomios de Bernstein. | ||
| − | La imagen representa la gráfica de la curva de Bézier y la poligonal de control. Se puede observar cómo los puntos de control influyen en la forma de la curva, lo que | + | La imagen representa la gráfica de la curva de Bézier y la poligonal de control. Se puede observar cómo los puntos de control influyen en la forma de la curva, lo que permite adaptarla a distintas aplicaciones. |
| − | + | ==='''Código y representación'''=== | |
| − | [[Archivo:FiguraCampos1.jpg|377px|miniaturadeimagen|derecha| | + | [[Archivo:FiguraCampos1.jpg|377px|miniaturadeimagen|derecha|Se representa en el plano Z = 0 la curva cúbica (rojo) influida por la poligonal de control (azul).]] |
{{matlab|codigo= | {{matlab|codigo= | ||
| Línea 46: | Línea 46: | ||
P2 = [0, 2, 0]; | P2 = [0, 2, 0]; | ||
P3 = [4, 4, 0]; | P3 = [4, 4, 0]; | ||
| − | |||
% Puntos para la curva de Bézier | % Puntos para la curva de Bézier | ||
| Línea 55: | Línea 54: | ||
% Inicializar los puntos de la curva Bézier | % Inicializar los puntos de la curva Bézier | ||
| − | puntosCurva = zeros(numPuntos, | + | puntosCurva = zeros(numPuntos, 3); |
% Calcular los puntos de Bézier | % Calcular los puntos de Bézier | ||
for i = 1:numPuntos | for i = 1:numPuntos | ||
% Polinomio de Bernstein | % Polinomio de Bernstein | ||
| − | B0 = (1-t(i))^ | + | B0 = (1-t(i))^3; |
| − | B1 = | + | B1 = 3 * (1-t(i))^2 * t(i); |
| − | B2 = | + | B2 = 3 * (1-t(i)) * t(i)^2; |
| − | B3 = t(i)^ | + | B3 = t(i)^3; |
puntosCurva(i,:) = B0*P0 + B1*P1 + B2*P2 + B3*P3; | puntosCurva(i,:) = B0*P0 + B1*P1 + B2*P2 + B3*P3; | ||
| Línea 89: | Línea 88: | ||
}} | }} | ||
| − | ==Representación del campo tangente <math>T(t)</math> y del campo normal <math>N(t)</math> en varios puntos de la curva.== | + | =='''Representación del campo tangente <math>T(t)</math> y del campo normal <math>N(t)</math> en varios puntos de la curva.'''== |
| − | + | === '''Cálculo del Vector Tangente <math>T(t)</math>:'''=== | |
El vector tangente <math>T(t)</math> es la derivada de la curva \(B(t)\) respecto al parámetro <math>t</math>: | El vector tangente <math>T(t)</math> es la derivada de la curva \(B(t)\) respecto al parámetro <math>t</math>: | ||
| Línea 108: | Línea 107: | ||
donde <math>||B'(t)||=\sqrt{(B'_x(t))^2 + (B'_y(t))^2} </math> | donde <math>||B'(t)||=\sqrt{(B'_x(t))^2 + (B'_y(t))^2} </math> | ||
| − | + | === '''Cálculo del Vector Normal <math>N(t)</math>:'''=== | |
Como el vector normal es ortogonal al vector tangente, lo calculamos haciendo uso del tensor rotación <math>R</math> con eje unitario y ángulo 90º (<math>\frac{\pi}{2}</math> radianes). | Como el vector normal es ortogonal al vector tangente, lo calculamos haciendo uso del tensor rotación <math>R</math> con eje unitario y ángulo 90º (<math>\frac{\pi}{2}</math> radianes). | ||
| Línea 123: | Línea 122: | ||
<center> <math> R(e_z,90º)=\begin{pmatrix} 0 & -1 \\ 1 & 0 \end{pmatrix} </math> </center> | <center> <math> R(e_z,90º)=\begin{pmatrix} 0 & -1 \\ 1 & 0 \end{pmatrix} </math> </center> | ||
| + | ==='''Código y representación'''=== | ||
| − | [[Archivo:FiguraCampos2.jpg|377px|miniaturadeimagen|derecha| | + | [[Archivo:FiguraCampos2.jpg|377px|miniaturadeimagen|derecha|Haciendo uso de los datos anteriores, en esta gráfica se representa el campo tangente y normal en 12 puntos equidistantes de la curva.]] |
{{matlab|codigo= | {{matlab|codigo= | ||
% Vector de puntos de control coplanarios | % Vector de puntos de control coplanarios | ||
| Línea 175: | Línea 175: | ||
}} | }} | ||
| − | ==Representación de la curvatura de la curva en función del parámetro <math>t</math>.== | + | =='''Representación de la curvatura de la curva en función del parámetro <math>t</math>.'''== |
| − | La curvatura de una curva | + | La curvatura es una medida del cambio de dirección del vector tangente a una curva, cuanto más rápido cambia este a medida que nos desplazamos a lo largo de la curva, se dice que es más grande la curvatura. Se puede expresar como una función del parámetro <math>t</math>, que generalmente parametriza la curva. En este apartado se usará su parametrización para representar el gráfico de la curvatura de la curva en los cuatro siguientes puntos: <math> P_0=(0,0)</math> , <math>P_1=(4,2)</math> , <math>P_2=(0,2)</math> y <math>P_3=(4,4) </math>. |
| − | En este apartado | + | |
| − | + | Se utilizarán los polinomios de Berstein para poder calcular la posición de cada punto de la curva que se define como: <math> B(t) = (x(t), y(t)) </math>. Posteriormente será necesario calcular las derivadas de primer y segundo orden en función del parámetro <math>t</math> tanto de <math>x</math> como de <math>y</math> y se calculará la curvatura mediante la siguiente fórmula: | |
| − | <br> <center> <math> | + | <br> <center> <math> \kappa(t)= \frac{|x'(t)y''(t)-y'(t)x''(t)|}{((x'(t))^2 + (y'(t))^2)^\frac{3}{2}}</math> </center> <br> |
| − | [[Archivo:Foto apartado 3.jpg|500px|miniaturadeimagen| | + | ==='''Código y representación'''=== |
| + | [[Archivo:Foto apartado 3.jpg|500px|miniaturadeimagen|Se observa una curvatura baja en el medio (valores cercanos a t = 0,5) debido a que la curva de Bézier es más suave en la mitad de su trayectoria.]] | ||
{{matlab|codigo= | {{matlab|codigo= | ||
| Línea 191: | Línea 191: | ||
P2 = [0, 2, 0]; | P2 = [0, 2, 0]; | ||
P3 = [4, 4, 0]; | P3 = [4, 4, 0]; | ||
| − | |||
% Puntos para la curva de Bézier | % Puntos para la curva de Bézier | ||
| Línea 205: | Línea 204: | ||
for i = 1:numPuntos | for i = 1:numPuntos | ||
% Polinomio de Bernstein | % Polinomio de Bernstein | ||
| − | B0 = (1-t(i))^ | + | B0 = (1-t(i))^3; |
| − | B1 = | + | B1 = 3 * (1-t(i))^2 * t(i); |
| − | B2 = | + | B2 = 3 * (1-t(i)) * t(i)^2; |
| − | B3 = t(i)^ | + | B3 = t(i)^3; |
puntosCurva(i,:) = B0*P0 + B1*P1 + B2*P2 + B3*P3; | puntosCurva(i,:) = B0*P0 + B1*P1 + B2*P2 + B3*P3; | ||
| Línea 230: | Línea 229: | ||
}} | }} | ||
| − | ==Animación del vector tangente, el vector normal y la circunferencia osculatriz asociados a cada punto de la curva de Bézier.== | + | =='''Animación del vector tangente, el vector normal y la circunferencia osculatriz asociados a cada punto de la curva de Bézier.'''== |
| + | Para poder calcular el '''vector tangente, el vector normal y la circunferencia osculatriz''' a medida que nos movemos a lo largo de una curva de Bézier es importante entender cómo se define la curva y cómo obtener las propiedades geométricas pedidas a partir de las propiedades de las derivadas de la curva. | ||
| + | ==='''Curva de Bézier y su derivada'''=== | ||
| + | Como bien dice el enunciado, consideraremos una curva de Bézier de '''orden n''' definida por el conjunto de puntos de control <big>{</big> <math>P_0,P_1,P_2,P_3</math><big>}</big>. La fórmula paramétrica sería: | ||
| + | <br> <center> <math> B(t)=\sum_{i=0}^n B_{i,n}(t) P_i\ </math></center> | ||
| + | donde <math>B_{i,n}(t)</math> son los polinomios de Bernstein y <math>t</math> es el parámetro que varía entre 0 y 1. Los polinomios están dados por: | ||
| + | |||
| + | <br> <center> <math> B_{i,n}(t) = \binom{n}{i} t^i (1-t)^{n-i}\ </math></center> | ||
| + | |||
| + | para \(t \in [0, 1]\), y donde \(\binom{n}{i}\) es el coeficiente binomial. | ||
| + | |||
| + | |||
| + | En este caso se han usado los siguientes puntos: | ||
| + | |||
| + | <br/><math> \;\left\{\begin{matrix}P_0=(0,0,0) \\ P_1=(4,2,0) \\ P_2=(0,2,0) \\ P_3=(4,4,0) \end{matrix}\right.</math> | ||
| + | |||
| + | |||
| + | La curva de Bézier quedaría de la siguiente forma: <br> <math> B(t) = (1 − t)^{3}·P_0 + 3(1 − t)^{2}·t·P_1 + (1 − t)^{2}·t^{2}·P_2 + t^{3}·P_3 </math> | ||
| + | |||
| + | ==='''Vector Tangente (Primera Derivada)'''=== | ||
| + | El vector tangente en un punto <math>t</math> es el vector que '''indica la dirección en la que se mueve la curva cuando <math>t</math> cambia'''. Para obtenerlo, calcularemos la '''primera derivada''' de la curva de Bézier mediante: <br><center><math> B'(t)=\sum_{i=0}^{n-1} (P_{i+1} - P_i)·B_{i,n-1}(t)\ </math></center> Es decir,<br> <math>B'(t) = 3(1 − t)^{2}·(P_1 - P_0) + 6(1 − t)·t·(P_2 - P_1) + 3t^{2}·(P_3 - P_2) </math> | ||
| + | |||
| + | |||
| + | Sustituyendo según los valores: <br><math>B'(t) = 3(1 − t)^{2}·[4,2,0] + 6(1 − t)·t·[-4,0,,0] + 3t^{2}·[4,2,0] </math> | ||
| + | |||
| + | |||
| + | El vector tangente <math>T(t)</math> en el punto <math>t</math> es simplemente la '''normalización''' de <math>B'(t)</math>: <br><center><math>T(t) = \frac{B'(t)}{|B'(t)|}</math>''(unitario)''</center> | ||
| + | |||
| + | Este vector '''apunta en la dirección de la tangente a la curva'''. | ||
| + | |||
| + | ==='''Vector Normal (Segunda Derivada)'''=== | ||
| + | El vector normal es '''perpendicular al vector tangente y apunta en la dirección en la que la curva se "curva"'''. Para obtener el vector normal, primero necesitas la '''segunda derivada''' de la curva: <br><center><math> B''(t)=\sum_{i=0}^{n-2} (P_{i+2} - 2 P_{i+1} + P_i)·B_{i,n-2}(t)\ </math></center> | ||
| + | |||
| + | |||
| + | Entonces, <br><math>B''(t) = 6(1 − t)·(P_1 - P_0) + 6[2(1 − t)-2t]·(P_2 - P_1) + 6t·(P_3 - P_2) </math> | ||
| + | |||
| + | |||
| + | Sustituyendo y simplificando, <br><math>B''(t) = 6(1 − t)·[4,2,0] + 6(2-4t)·[-4,0,0] + 6t·[4,2,0] </math> | ||
| + | |||
| + | |||
| + | El vector normal <math>N(t)</math> se obtendrá a partir de la siguiente ecuación: <br><center><math> N(t) = \frac{B''(t)}{|B''(t)|}</math> ''(unitario)''</center> | ||
| + | |||
| + | Es '''importante''' tener en cuenta que <math>N(t)</math> está asociado con el cambio de dirección del vector tangente. | ||
| + | |||
| + | ==='''Circunferencia Osculatriz'''=== | ||
| + | La circunferencia osculatriz en un punto dado de la curva es el círculo que '''tiene la misma tangente y curvatura que la curva en ese punto'''. Para hallar la ecuación de esta circunferencia necesitamos calcular '''tres variables''': | ||
| + | ===='''Centro de la circunferencia osculatriz:'''==== | ||
| + | Se puede obtener a partir de la '''curvatura''' y los vectores tangente y normal. Este centro está ubicado a una distancia <math>R</math> del punto <math>B(t)</math>, donde <math>R</math> es el '''radio de curvatura''', que se puede calcular como: <br><center><math> R = \frac{1}{|B''(t)|}</math></center> | ||
| + | |||
| + | ===='''Posición del centro'''==== | ||
| + | El centro de la circunferencia está desplazado desde el punto <math>B(t)</math> a lo largo del vector normal <math>N(t)</math> a una distancia <math>R</math>. Entonces, la posición del centro de la circunferencia osculatriz es: <br><center><math>C(t) = B(t) + R·N(t)</math></center> | ||
| + | |||
| + | ===='''Ecuación de la circunferencia:'''==== | ||
| + | La ecuación de la circunferencia en el plano es:<br> <center><math>||r(t) − C(t)|| = R</math> <br>dónde <math>r(t)</math> es cualquier punto sobre la circunferencia.</center> | ||
| + | |||
| + | ==='''Código y animación'''=== | ||
| + | [[Archivo:Bezier_4.gif|500px||miniaturadeimagen|Animación del vector tangente, el vector normal y la circunferencia osculatriz asociados a cada punto de la curva de Bézier.]] | ||
{{matlab|codigo= | {{matlab|codigo= | ||
| − | % Puntos de control | + | % Puntos de control para una curva de Bézier cúbica |
| − | P0 = [0, 0,0]; | + | P0 = [0, 0,0]; |
| − | P1 = [4, 2,0]; | + | P1 = [4, 2,0]; |
| − | P2 = [0, 2,0]; | + | P2 = [0, 2,0]; |
| − | P3 = [4, 4,0]; | + | P3 = [4, 4,0]; |
| − | % | + | % Valor del parámetro t[0,1] |
| − | t = linspace(0, 1, 100); | + | t = linspace(0, 1, 100); |
| − | % | + | % Componentes de la función para calcularnos el polinomio de Bernstein |
| − | B0 = (1 - t).^3; | + | B0 = (1 - t).^3; |
| − | B1 = 3 * t .* (1 - t).^2; | + | B1 = 3 * t .* (1 - t).^2; |
| − | B2 = 3 * t.^2 .* (1 - t); | + | B2 = 3 * t.^2 .* (1 - t); |
| − | B3 = t.^3; | + | B3 = t.^3; |
| − | % Coordenadas de la curva de Bézier | + | % Coordenadas de la curva de Bézier |
| − | x = B0 * P0(1) + B1 * P1(1) + B2 * P2(1) + B3 * P3(1); | + | x = B0 * P0(1) + B1 * P1(1) + B2 * P2(1) + B3 * P3(1); |
| − | y = B0 * P0(2) + B1 * P1(2) + B2 * P2(2) + B3 * P3(2); | + | y = B0 * P0(2) + B1 * P1(2) + B2 * P2(2) + B3 * P3(2); |
| − | % | + | % Funciones para calcularnos las derivadas de la curva |
| − | dx = gradient(x, t); | + | dx = gradient(x, t); |
| − | dy = gradient(y, t); | + | dy = gradient(y, t); |
| − | % | + | % Cálculo del vector tangente |
| − | T = [dx; dy] ./ sqrt(dx.^2 + dy.^2); | + | T = [dx; dy] ./ sqrt(dx.^2 + dy.^2); |
| − | % | + | % Cálculo del vector normal (perpendiculares al tangente) |
| − | N = [-T(2, :); T(1, :)]; | + | N = [-T(2, :); T(1, :)]; |
| − | % | + | % Funciones para calcularnos las segundas derivadas |
| − | + | ddx = gradient(dx, t); | |
| − | + | ddy = gradient(dy, t); | |
| − | % Curvatura | + | % Curvatura |
| − | curvatura = abs(dx .* | + | curvatura = abs(dx .* ddy - dy .* ddx) ./ (dx.^2 + dy.^2).^(3/2); |
| − | % Radio de curvatura | + | % Radio de la circunferencia osculatriz |
| − | R = 1 ./ curvatura; | + | if curvatura ~= 0 |
| − | % | + | R = 1 ./ curvatura; |
| − | figure; | + | else |
| − | for i = 1:length(t) | + | R = Inf; |
| − | + | end | |
| − | + | % Estructura de la animación | |
| − | + | figure; | |
| − | + | for i = 1:length(t) | |
| − | + | clf; | |
| − | + | plot(x, y, 'r--', 'LineWidth', 2); | |
| − | + | hold on; | |
| − | + | quiver(x(i), y(i), T(1, i), T(2, i), 0.5, 'g', 'LineWidth', 1.5); % Tangente | |
| − | + | quiver(x(i), y(i), N(1, i), N(2, i), 0.5, 'm', 'LineWidth', 1.5); % Normal | |
| − | + | % Centro de la circunferencia osculatriz y gráfica | |
| − | + | center = [x(i), y(i)] + R(i) * N(:, i)'; | |
| − | + | theta = linspace(0, 2*pi, 100); | |
| − | + | circle_x = center(1) + R(i) * cos(theta); | |
| − | + | circle_y = center(2) + R(i) * sin(theta); | |
| − | end | + | plot(circle_x, circle_y, 'b','LineWidth', 1.25); |
| + | title('Curva de Bézier: Tangente, Normal y Circunferencia Osculatriz'); | ||
| + | xlabel('X'); | ||
| + | ylabel('Y'); | ||
| + | axis equal; grid on; | ||
| + | pause(0.08); | ||
| + | end | ||
}} | }} | ||
| − | ==Representación de la curva de Bézier tridimensional, junto con la curva poligonal que conecta los cuatro puntos que están en el espacio tridimensional y no pertenecen al mismo plano.== | + | =='''Representación de la curva de Bézier tridimensional, junto con la curva poligonal que conecta los cuatro puntos que están en el espacio tridimensional y no pertenecen al mismo plano.'''== |
| + | Para calcular y representar la '''curva de Bézier tridimensional''' que conecta los puntos {<math>P_0</math>, <math>P_1</math>, <math>P_2</math>, <math>P_3</math>} siendo entre ellos no coplanarios, hemos utilizado la curva de Bézier cúbica; extendiéndola al espacio 3D. La diferencia principal es que los puntos de control están en <math>ℝ^{3}</math>, por lo que las coordenadas <math>x</math>, <math>y</math>, <math>z</math> de cada punto de la curva serán calculadas en función de esas dimensiones. | ||
| + | Para el cálculo de la '''curva poligonal''' simplemente se hace una serie de líneas rectas que conectan los puntos de control {<math>P_0</math>, <math>P_1</math>, <math>P_2</math>, <math>P_3</math>} y se ha representado como un conjunto de segmentos de línea entre estos puntos. | ||
| + | |||
| + | Los puntos que se han elegido para este apartado son: | ||
| + | |||
| + | <br/><math> \;\left\{\begin{matrix}P_0=(0,0,0) \\ P_1=(2,3,1) \\ P_2=(4,1,3) \\ P_3=(6,4,0) \end{matrix}\right.</math> | ||
| + | |||
| + | ==='''Código y representación'''=== | ||
| + | [[Archivo:Imagenapartado5.jpg|500px||miniaturadeimagen|Representación de la curva de Bézier tridimensional junto con la curva poligonal teniendo en cuenta que los puntos son no coplanarios.]] | ||
{{matlab|codigo= | {{matlab|codigo= | ||
% Curva de Bézier Cúbica en 3D | % Curva de Bézier Cúbica en 3D | ||
| Línea 296: | Línea 366: | ||
% Matriz de puntos de control | % Matriz de puntos de control | ||
| − | + | puntosControl = [P0; P1; P2; P3]; | |
% Función para calcular punto de Bézier | % Función para calcular punto de Bézier | ||
| − | function P = | + | function P = puntoBezier(puntosControl, t) |
| − | n = size( | + | n = size(puntosControl, 1) - 1; |
P = zeros(1, 3); | P = zeros(1, 3); | ||
for i = 0:n | for i = 0:n | ||
b = nchoosek(n, i) * (t^i) * ((1-t)^(n-i)); | b = nchoosek(n, i) * (t^i) * ((1-t)^(n-i)); | ||
| − | P = P + b * | + | P = P + b * puntosControl(i+1, :); |
end | end | ||
end | end | ||
% Generar puntos de la curva | % Generar puntos de la curva | ||
| − | + | numPuntos = 100; | |
| − | t = linspace(0, 1, | + | t = linspace(0, 1, numPuntos); |
| − | + | puntosCurva = zeros(numPuntos, 3); | |
| − | for i = 1: | + | for i = 1:numPuntos |
| − | + | puntosCurva(i, :) = puntoBezier(puntosControl, t(i)); | |
end | end | ||
| Línea 323: | Línea 393: | ||
axis equal; | axis equal; | ||
| − | % | + | % Gráfico de la curva de Bézier |
| − | plot3( | + | plot3(puntosCurva(:,1), puntosCurva(:,2), puntosCurva(:,3), 'r-', 'LineWidth', 2); |
| − | % | + | % Gráfico de la curva poligonal (polígono de control) |
| − | plot3( | + | plot3(puntosControl(:,1), puntosControl(:,2), puntosControl(:,3), 'bo--', 'LineWidth', 1.5); |
% Decorar los puntos de control | % Decorar los puntos de control | ||
| − | scatter3( | + | scatter3(puntosControl(:,1), puntosControl(:,2), puntosControl(:,3), 100, 'r', 'filled'); |
% Etiquetar los puntos de control | % Etiquetar los puntos de control | ||
labels = {'P0', 'P1', 'P2', 'P3'}; | labels = {'P0', 'P1', 'P2', 'P3'}; | ||
for i = 1:length(labels) | for i = 1:length(labels) | ||
| − | text( | + | text(puntosControl(i,1), puntosControl(i,2), puntosControl(i,3), ... |
labels{i}, 'FontSize', 10, 'FontWeight', 'bold'); | labels{i}, 'FontSize', 10, 'FontWeight', 'bold'); | ||
end | end | ||
| Línea 344: | Línea 414: | ||
ylabel('Eje Y'); | ylabel('Eje Y'); | ||
zlabel('Eje Z'); | zlabel('Eje Z'); | ||
| − | view(45, | + | view(45, 65); % Ángulo de vista para mejor perspectiva 3D |
legend('Curva de Bézier', 'Polígono de Control'); | legend('Curva de Bézier', 'Polígono de Control'); | ||
hold off; | hold off; | ||
| Línea 350: | Línea 420: | ||
% Información adicional sobre los puntos de control | % Información adicional sobre los puntos de control | ||
disp('Puntos de Control:'); | disp('Puntos de Control:'); | ||
| − | for i = 1:size( | + | for i = 1:size(puntosControl, 1) |
| − | fprintf('P%d: [%.2f, %.2f, %.2f]\n', i-1, | + | fprintf('P%d: [%.2f, %.2f, %.2f]\n', i-1, puntosControl(i,:)); |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
end | end | ||
}} | }} | ||
| − | ==Representación de los gráficos de la curvatura y de la torsión como funciones del parámetro <math>t</math>.== | + | =='''Representación de los gráficos de la curvatura y de la torsión como funciones del parámetro <math>t</math>.'''== |
Una vez la curva de Bézier tridimensional junto a su curva poligonal han sido representadas, se continuará con la representación de la curvatura y la torsión como funciones del parámetro <math>t</math>. | Una vez la curva de Bézier tridimensional junto a su curva poligonal han sido representadas, se continuará con la representación de la curvatura y la torsión como funciones del parámetro <math>t</math>. | ||
| − | <br> Empezando por la curvatura (<math>\kappa(t)</math>), que marca cuanto se desvía la recta tangente a lo largo de la curva, que en | + | ==='''Curvatura:'''=== |
| − | <br> <center> <math> \kappa(t) = \frac{\|\mathbf{B}'(t) \times | + | <br> Empezando por la curvatura (<math>\kappa(t)</math>), que marca cuanto se desvía la recta tangente a lo largo de la curva, que en otras palabras sería cuánto cambia la curvatura en el plano, y se calcula en función de la siguiente expresión: |
| + | <br> <center> <math> \kappa(t) = \frac{\|\mathbf{B}'(t) \times \mathbf{B}''(t)|}{\|\mathbf{B}'(t)\|^3} </math> </center> | ||
<br> Siendo <math> \mathbf{B}'(t) </math> la primera derivada de la curva en función de <math>t</math>, y <math> \mathbf{B}''(t) </math> la segunda derivada en funcón de <math> t </math>. | <br> Siendo <math> \mathbf{B}'(t) </math> la primera derivada de la curva en función de <math>t</math>, y <math> \mathbf{B}''(t) </math> la segunda derivada en funcón de <math> t </math>. | ||
<br> Por tanto , <math> \|\mathbf{B}'(t) \times \mathbf{B}''(t)\| </math> equivale a la norma del producto mixto de la primera y la segunda derivada de la curva <math> \mathbf{B}(t) </math>.<br> | <br> Por tanto , <math> \|\mathbf{B}'(t) \times \mathbf{B}''(t)\| </math> equivale a la norma del producto mixto de la primera y la segunda derivada de la curva <math> \mathbf{B}(t) </math>.<br> | ||
| + | ==='''Torsión:'''=== | ||
<br> Por otro lado, encontramos la torsión(<math> \tau(t)</math>) que mide cuánto cambia la orientación del plano tangente a lo largo de la curva, y sigue la siguiente expresión: | <br> Por otro lado, encontramos la torsión(<math> \tau(t)</math>) que mide cuánto cambia la orientación del plano tangente a lo largo de la curva, y sigue la siguiente expresión: | ||
<br> <center> <math> \tau(t) = \frac{\mathbf{B}'(t) \times \mathbf{B}''(t) · \mathbf{B}'''(t)}{|\mathbf{B}'(t) \times \mathbf{B}''(t)|^2} = \frac{det( \mathbf{B}'(t), \mathbf{B}''(t), \mathbf{B}'''(t))}{|\mathbf{B}'(t) \times \mathbf{B}''(t)|^2} </math> </center> | <br> <center> <math> \tau(t) = \frac{\mathbf{B}'(t) \times \mathbf{B}''(t) · \mathbf{B}'''(t)}{|\mathbf{B}'(t) \times \mathbf{B}''(t)|^2} = \frac{det( \mathbf{B}'(t), \mathbf{B}''(t), \mathbf{B}'''(t))}{|\mathbf{B}'(t) \times \mathbf{B}''(t)|^2} </math> </center> | ||
| − | <br> Dónde <math> \mathbf{B}'(t) </math> vuelve a ser la primera derivada de la curva en función de <math>t</math>, y <math> \mathbf{B}''(t) </math> la segunda derivada de la curva en | + | <br> Dónde <math> \mathbf{B}'(t) </math> vuelve a ser la primera derivada de la curva en función de <math>t</math>, y <math> \mathbf{B}''(t) </math> la segunda derivada de la curva en función de <math> t </math>, además, aparece también <math> \mathbf{B}'''(t) </math> que sería la tercera derivada de la curva. |
| − | <br> | + | <br>Como se puede observar en la expresión, hay un producto vectorial por un producto escalar, eso se convierte en un producto mixto y se resuelve como el determinante de las tres derivadas de la curva, en este caso como se ve en el desarrollo de la expresión. |
| − | + | ||
| − | [[Archivo: | + | ==='''Código y representación de la curva de Bézier, su curvatura y torsión en función de <math> t </math>:'''=== |
| + | |||
| + | [[Archivo:Imagenapartado6.jpg|600px|miniaturadeimagen|En la gráfica ℝ3 vemos la curva de Bézier en el espacio, mientras que a la derecha se representa la curvatura y la torsión de la curva tridimensional en función de t.]] | ||
{{matlab|codigo= | {{matlab|codigo= | ||
| − | + | % Puntos de control en R3 (no coplanarios) | |
| − | + | ||
| − | % Puntos de control en | + | |
P = [0 0 0; 2 3 1; 4 1 3; 6 4 0]; | P = [0 0 0; 2 3 1; 4 1 3; 6 4 0]; | ||
| Línea 393: | Línea 448: | ||
n = 100; | n = 100; | ||
t = linspace(0, 1, n); | t = linspace(0, 1, n); | ||
| − | |||
| − | |||
| − | |||
| − | |||
| − | |||
% Inicializamos la curva de Bézier | % Inicializamos la curva de Bézier | ||
| Línea 443: | Línea 493: | ||
subplot(2, 2, [1 3]); | subplot(2, 2, [1 3]); | ||
% Curva de Bézier | % Curva de Bézier | ||
| − | plot3(curve(:,1), curve(:,2), curve(:,3), ' | + | plot3(curve(:,1), curve(:,2), curve(:,3), 'r-', 'LineWidth', 2); |
hold on; | hold on; | ||
% Polígono de control | % Polígono de control | ||
| − | plot3(P(:,1), P(:,2), P(:,3), ' | + | plot3(P(:,1), P(:,2), P(:,3), 'bo--'); |
title('Curva de Bézier'); | title('Curva de Bézier'); | ||
| − | xlabel('X'); ylabel('Y'); zlabel('Z'); | + | xlabel('Eje X'); ylabel('Eje Y'); zlabel('Eje Z'); |
grid on; | grid on; | ||
view(45, 30); | view(45, 30); | ||
| + | |||
| + | % Etiquetar los puntos de control | ||
| + | labels = {' P0', ' P1', ' P2', ' P3'}; | ||
| + | for i = 1:length(labels) | ||
| + | text(matrizPuntos(i,1), matrizPuntos(i,2), matrizPuntos(i,3), ... | ||
| + | labels{i}, 'FontSize', 10, 'FontWeight', 'bold'); | ||
| + | end | ||
% Gráfico de curvatura | % Gráfico de curvatura | ||
subplot(2, 2, 2); | subplot(2, 2, 2); | ||
| − | plot(t, curvature, ' | + | plot(t, curvature, 'r-', 'LineWidth', 2); |
title('Curvatura'); | title('Curvatura'); | ||
xlabel('t'); ylabel('Curvatura'); | xlabel('t'); ylabel('Curvatura'); | ||
| Línea 461: | Línea 518: | ||
% Gráfico de torsión | % Gráfico de torsión | ||
subplot(2, 2, 4); | subplot(2, 2, 4); | ||
| − | plot(t, torsion, ' | + | plot(t, torsion, 'b-', 'LineWidth', 2); |
title('Torsión'); | title('Torsión'); | ||
xlabel('t'); ylabel('Torsión'); | xlabel('t'); ylabel('Torsión'); | ||
| Línea 467: | Línea 524: | ||
sgtitle('Curvatura y torsión en función de t'); | sgtitle('Curvatura y torsión en función de t'); | ||
| + | |||
| + | % Función para trabajar con el polinomio de Bernstein | ||
| + | function b = bernstein(i, n, t) | ||
| + | b = nchoosek(n, i) * (t.^i) .* ((1-t).^(n-i)); | ||
| + | end | ||
}} | }} | ||
| − | ==Animación que representa el triedro de Frenet que se mueve a lo largo de la curva.== | + | =='''Animación que representa el triedro de Frenet que se mueve a lo largo de la curva.'''== |
| − | Tras haber representado la curva, pasamos al triedro de Frenet que es un conjunto de tres vectores que se utilizan para describir el comportamiento geométrico de una curva en el espacio tridimensional. | + | Tras haber representado la curva, pasamos al triedro de Frenet que es un conjunto de tres vectores que se utilizan para describir el comportamiento geométrico de una curva en el espacio tridimensional. Estos vectores son: |
<br> el vector <math> \overrightarrow{T} </math> que hace referencia al vector tangente a lo largo de la curva <math> \mathbf{B}(t) </math> | <br> el vector <math> \overrightarrow{T} </math> que hace referencia al vector tangente a lo largo de la curva <math> \mathbf{B}(t) </math> | ||
| Línea 477: | Línea 539: | ||
<br> Una vez definido lo que es y los vectores que lo componen, se representa, gracias al programa MATLAB, una animación del Triedro de Frenet a lo largo de la curva, dónde se utilizó el siguiente código para su realización: | <br> Una vez definido lo que es y los vectores que lo componen, se representa, gracias al programa MATLAB, una animación del Triedro de Frenet a lo largo de la curva, dónde se utilizó el siguiente código para su realización: | ||
| − | + | ==='''Código y animación'''=== | |
| + | [[Archivo:frenet_3d_animationnn.gif|377px|miniaturadeimagen|En la animación se representa el vector binomial en color magenta, mientras que los vectores normal y tangencial son los vectores cian y verde respectivamente.]] | ||
{{matlab|codigo= | {{matlab|codigo= | ||
| − | % | + | % Puntos de control en R3 (no coplanarios) |
| − | + | ||
| − | + | ||
P = [0 0 0; 1 2 1; 3 1 2; 4 3 3]; | P = [0 0 0; 1 2 1; 3 1 2; 4 3 3]; | ||
| − | % | + | % Número de puntos |
n = 100; | n = 100; | ||
t = linspace(0, 1, n); | t = linspace(0, 1, n); | ||
| − | % | + | % Puntos de la curva de Bézier |
| − | + | curva = zeros(n, 3); | |
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
| − | + | ||
for i = 1:size(P, 1) | for i = 1:size(P, 1) | ||
| − | + | curva = curva + bernstein(i-1, size(P, 1)-1, t)' .* P(i, :); | |
end | end | ||
| − | % | + | % Primera derivada |
d1 = zeros(n, 3); | d1 = zeros(n, 3); | ||
for i = 1:size(P, 1)-1 | for i = 1:size(P, 1)-1 | ||
| Línea 510: | Línea 561: | ||
end | end | ||
| − | % | + | % Segunda derivada |
d2 = zeros(n, 3); | d2 = zeros(n, 3); | ||
for i = 1:size(P, 1)-2 | for i = 1:size(P, 1)-2 | ||
| Línea 517: | Línea 568: | ||
end | end | ||
| − | % | + | % Triedro de Frenet |
| − | + | tangente = d1 ./ vecnorm(d1, 2, 2); | |
normal = cross(d2, d1) ./ (vecnorm(d1, 2, 2).^2); | normal = cross(d2, d1) ./ (vecnorm(d1, 2, 2).^2); | ||
| − | binormal = cross( | + | binormal = cross(tangente, normal); |
| − | % | + | % Normalizar los vectores |
normal = normal ./ vecnorm(normal, 2, 2); | normal = normal ./ vecnorm(normal, 2, 2); | ||
binormal = binormal ./ vecnorm(binormal, 2, 2); | binormal = binormal ./ vecnorm(binormal, 2, 2); | ||
| − | % | + | % Preparar la animación |
figure('Position', [100, 100, 1000, 800]); | figure('Position', [100, 100, 1000, 800]); | ||
axis equal; | axis equal; | ||
| Línea 532: | Línea 583: | ||
grid on; | grid on; | ||
| − | % | + | % Graficar la curva de Bézier |
| − | plot3( | + | plot3(curva(:,1), curva(:,2), curva(:,3), 'r-', 'LineWidth', 2.5); |
| − | plot3(P(:,1), P(:,2), P(:,3), ' | + | plot3(P(:,1), P(:,2), P(:,3), 'bo--'); |
| − | % | + | % Animación del triedro de Frenet |
| − | title('Animación Triedro de Frenet'); | + | title('Animación del Triedro de Frenet'); |
| − | xlabel('X'); ylabel('Y'); zlabel('Z'); | + | xlabel('Eje X'); ylabel('Eje Y'); zlabel('Eje Z'); |
| − | % | + | % Longitud de los vectores para la visualización |
| − | + | longitud_vectores = 0.5; | |
| − | % | + | % Crear líneas para los vectores |
| − | + | linea_tangente = line([0 0], [0 0], [0 0], 'Color', 'g', 'LineWidth', 2); | |
| − | + | linea_normal = line([0 0], [0 0], [0 0], 'Color', 'c', 'LineWidth', 2); | |
| − | + | linea_binormal = line([0 0], [0 0], [0 0], 'Color', 'm', 'LineWidth', 2); | |
| − | % | + | % Animación |
view(80, 60); | view(80, 60); | ||
for i = 1:n | for i = 1:n | ||
| − | % | + | % Actualizar las líneas de los vectores |
| − | set( | + | set(linea_tangente, 'XData', [curva(i,1), curva(i,1) + longitud_vectores*tangente(i,1)], ... |
| − | + | 'YData', [curva(i,2), curva(i,2) + longitud_vectores*tangente(i,2)], ... | |
| − | + | 'ZData', [curva(i,3), curva(i,3) + longitud_vectores*tangente(i,3)]); | |
| − | set( | + | set(linea_normal, 'XData', [curva(i,1), curva(i,1) + longitud_vectores*normal(i,1)], ... |
| − | + | 'YData', [curva(i,2), curva(i,2) + longitud_vectores*normal(i,2)], ... | |
| − | + | 'ZData', [curva(i,3), curva(i,3) + longitud_vectores*normal(i,3)]); | |
| − | set( | + | set(linea_binormal, 'XData', [curva(i,1), curva(i,1) + longitud_vectores*binormal(i,1)], ... |
| − | + | 'YData', [curva(i,2), curva(i,2) + longitud_vectores*binormal(i,2)], ... | |
| − | + | 'ZData', [curva(i,3), curva(i,3) + longitud_vectores*binormal(i,3)]); | |
drawnow; | drawnow; | ||
pause(0.05); | pause(0.05); | ||
end | end | ||
| − | |||
| − | == | + | % Función para calcular el coeficiente binomial |
| + | function b = coefBin(n, k) | ||
| + | b = factorial(n) / (factorial(k) * factorial(n-k)); | ||
| + | end | ||
| − | + | % Función para calcular el polinomio de Bernstein | |
| − | + | function b = bernstein(i, n, t) | |
| − | + | b = coefBin(n, i) * (t.^i) .* ((1-t).^(n-i)); | |
| + | end | ||
| + | }} | ||
| − | <br /> Esto implica que <math>F_c≤F_{\text{fricción}}→κν^2≤μg</math> | + | =='''Aplicación de una curva de Bézier al tramo de un circuito de <math>F_1</math>.'''== |
| + | === '''Condiciones''' === | ||
| + | La velocidad escalar constante <math>ν_0</math> que debe mantener un Ferrari F2004 para no salirse de la pista en ningún punto de un circuito con el trazado de una curva de Bézier, debe ser tal que la fuerza centrípeta <math>F_c=mκν^2</math> no exceda la fuerza máxima de fricción <math>F_{\text{fricción}}=μmg</math>. <br /> | ||
| + | Siendo <math>m</math> la masa del Ferrari, <math>κ</math> la curvatura de la pista, <math>g</math> la aceleración de la gravedad y <math>μ</math> el coeficiente de fricción entre los neumáticos y la pista (se asume igual a 1.5). <br /><br /> | ||
| + | |||
| + | === '''Cálculo analítico de la velocidad escalar constante <math>ν_0</math>'''=== | ||
| + | Esto implica que <math>F_c≤F_{\text{fricción}}→κν^2≤μg</math> | ||
<br /> Para que la velocidad sea constante y segura se tomará el valor máximo de <math>κ(t)</math> a lo largo del intervalo <math>t∈[0,1]</math>. Así pues: <math>ν_0≤\sqrt{\frac{μg}{κ_{\text{máx}}}}</math> <br /> | <br /> Para que la velocidad sea constante y segura se tomará el valor máximo de <math>κ(t)</math> a lo largo del intervalo <math>t∈[0,1]</math>. Así pues: <math>ν_0≤\sqrt{\frac{μg}{κ_{\text{máx}}}}</math> <br /> | ||
Como ya se ha mencionado en apartados anteriores, para calcular la curvatura <math>κ(t)</math> se necesitan la primera y la segunda derivada de <math>B</math>: <math> \kappa(t) = \frac{\|\mathbf{B}'(t) \times \mathbf{B}''(t)\|}{\|\mathbf{B}'(t)\|^3} </math><br /> | Como ya se ha mencionado en apartados anteriores, para calcular la curvatura <math>κ(t)</math> se necesitan la primera y la segunda derivada de <math>B</math>: <math> \kappa(t) = \frac{\|\mathbf{B}'(t) \times \mathbf{B}''(t)\|}{\|\mathbf{B}'(t)\|^3} </math><br /> | ||
| − | Siendo B (por la fórmula general de las curvas de Bézier): <math>B=(1-t)^3P_0+3t(1-t)^2P_1+3t^2(1-t)P_2+t^3P_3</math><br /> | + | Siendo B para <math>n=3</math> (por la fórmula general de las curvas de Bézier): <math>B=(1-t)^3P_0+3t(1-t)^2P_1+3t^2(1-t)P_2+t^3P_3</math><br /> |
| − | + | Además se tendrán en cuenta los siguientes puntos de control: <math>P_0 =[0,0,0], P_1 = [30,50,5], P_2 = [60,−30,−10], P_3 = [100,0,0]</math>. <br /> | |
| − | <br /> | + | Analizando el problema con la animación 3D de la curva que se muestra más abajo, el programa nos devuelve el valor máximo de velocidad escalar constante posible para que el Ferrari no se salga de la pista: <math>24,1569</math> <math>m/s</math> <br /><br /> |
| − | Analizando el problema con la | + | |
| + | === '''Aceleración centrípeta y su vector director''' === | ||
| + | Por otro lado, la aceleración centrípeta es: <math>a_c=\frac{ν_0^2}{r}</math>. Sabiendo que: <math>r=\frac{1}{κ(t)}</math>. Entonces: <math>a_c=ν_0^2·κ(t)</math><br /> | ||
| + | Si esta se multiplica por el vector normal unitario a la curva de Bézier, se obtiene el vector aceleración centrípeta en la animación (radial, siempre apuntando al centro de la curvatura y perpendicular a la velocidad, que es tangencial)<br /> | ||
<br /> | <br /> | ||
| + | === '''Código y animación''' === | ||
| + | [[Archivo:animacion_ferrari_bezier.gif|500px|miniaturadeimagen|derecha|Animación del vector velocidad (en rojo) y el vector de la aceleración centrípeta (en verde) del Ferrari mientras recorre la pista con forma de curva de Bézier (en azul) para t∈(0,1)]] | ||
{{matlab|codigo= | {{matlab|codigo= | ||
| Línea 596: | Línea 662: | ||
g = 9.81; % Aceleración gravitatoria (m/s^2) | g = 9.81; % Aceleración gravitatoria (m/s^2) | ||
| − | % Funciones de la curva de Bézier | + | % Funciones de la curva de Bézier y derivadas |
function B = bezier(t, P0, P1, P2, P3) | function B = bezier(t, P0, P1, P2, P3) | ||
B = (1 - t)^3 * P0 + 3 * t * (1 - t)^2 * P1 + 3 * t^2 * (1 - t) * P2 + t^3 * P3; | B = (1 - t)^3 * P0 + 3 * t * (1 - t)^2 * P1 + 3 * t^2 * (1 - t) * P2 + t^3 * P3; | ||
| Línea 627: | Línea 693: | ||
curve = cell2mat(curve')'; | curve = cell2mat(curve')'; | ||
| − | % Cálculo de la curvatura | + | % Cálculo de la curvatura |
curvatures = arrayfun(@(t) curvature(t, P0, P1, P2, P3), t_values); | curvatures = arrayfun(@(t) curvature(t, P0, P1, P2, P3), t_values); | ||
| − | % Velocidad máxima | + | % Velocidad máxima segura |
kappa_max = max(curvatures); | kappa_max = max(curvatures); | ||
v0 = sqrt(mu * g / kappa_max); | v0 = sqrt(mu * g / kappa_max); | ||
| + | |||
| + | % Mostrar resultado | ||
disp(['Velocidad máxima segura (v0): ', num2str(v0), ' m/s']); | disp(['Velocidad máxima segura (v0): ', num2str(v0), ' m/s']); | ||
| − | % | + | % Crear figura |
figure; | figure; | ||
| − | + | hold on; | |
grid on; | grid on; | ||
| + | plot3(curve(1, :), curve(2, :), curve(3, :), 'b-', 'LineWidth', 2); | ||
| + | title('Curva de Bézier y animación del coche'); | ||
xlabel('X (m)'); | xlabel('X (m)'); | ||
ylabel('Y (m)'); | ylabel('Y (m)'); | ||
zlabel('Z (m)'); | zlabel('Z (m)'); | ||
| − | + | view(3); % Vista 3D | |
| − | + | ||
% Congelar los límites de los ejes | % Congelar los límites de los ejes | ||
| Línea 650: | Línea 719: | ||
min(curve(3, :)) max(curve(3, :))]); | min(curve(3, :)) max(curve(3, :))]); | ||
| − | % | + | % Crear los vectores para animación |
| − | + | h_vel = quiver3(0, 0, 0, 0, 0, 0, 'r', 'LineWidth', 2); % Vector velocidad | |
| − | + | h_ac = quiver3(0, 0, 0, 0, 0, 0, 'g', 'LineWidth', 2); % Vector aceleración centrípeta | |
| − | + | ||
| − | % | + | % Animar la curva |
| − | for i = 1:length(t_values) | + | for i = 1:10:length(t_values) % Aumentar el paso para controlar la velocidad de animación |
| − | + | t = t_values(i); | |
| − | + | % Posición, velocidad y aceleración centrípeta | |
| − | + | pos = bezier(t, P0, P1, P2, P3); | |
| − | + | Bp = bezier_prime(t, P0, P1, P2, P3); | |
| − | + | Bpp = bezier_double_prime(t, P0, P1, P2, P3); | |
| − | + | % Dirección del vector normal (centrípeta) | |
| − | + | normal_vec = cross(Bp, Bpp); | |
| + | normal_vec = normal_vec / norm(normal_vec); % Normalizar | ||
| + | ac = curvature(t, P0, P1, P2, P3) * v0^2 * normal_vec; | ||
| − | + | % Actualizar la posición de los vectores | |
| − | + | set(h_vel, 'XData', pos(1), 'YData', pos(2), 'ZData', pos(3), ... | |
| − | + | 'UData', Bp(1), 'VData', Bp(2), 'WData', Bp(3)); | |
| + | set(h_ac, 'XData', pos(1), 'YData', pos(2), 'ZData', pos(3), ... | ||
| + | 'UData', ac(1), 'VData', ac(2), 'WData', ac(3)); | ||
| − | + | % Pausa para crear la animación | |
| − | + | pause(0.05); | |
| − | + | ||
| − | + | ||
| − | + | ||
end | end | ||
| + | legend('Curva Bézier', 'Velocidad', 'Aceleración centrípeta'); | ||
hold off;}} | hold off;}} | ||
| − | ==Aplicaciones de las curvas de Bézier en la ingeniería.== | + | =='''Aplicaciones de las curvas de Bézier en la ingeniería.'''== |
| + | Las curvas de Bézier son herramientas matemáticas que se utilizan en diversas áreas de la ingeniería por su capacidad para representar trayectorias, modelar superficies complejas y generar movimientos precisos. En la ingeniería podemos ver diferentes aplicaciones: | ||
| + | === '''Modelización de trayectorias''' === | ||
| + | Se utilizan para diseñar trayectorias óptimas en diversos sistemas automatizados como la robótica o los vehículos autónomos: | ||
| + | ==== '''Robótica''' ==== | ||
| + | En robótica, las curvas de Bézier se utilizan para planificar trayectorias de movimientos de brazos robóticos. Por ejemplo, un brazo robótico que ensambla las partes de un producto utiliza estas curvas para una trayectoria óptima en la que no haya colisiones o movimientos bruscos. | ||
| + | [[Archivo:AnimacionBezierRobot.gif|miniaturadeimagen|centro|Movimiento de un brazo robótico mediante las curvas de Bézier]] | ||
| + | |||
| + | ==== '''Vehículos autónomos''' ==== | ||
| + | Las curvas de Bézier permiten calcular las rutas más seguras entre obstáculos en tiempo real. Por ejemplo, los vehículos Tesla tienen una conducción autónoma donde utilizan estas curvas para planificar la trayectoria, optimizar el consumo energético y evitar colisiones. | ||
| + | [[Archivo:image0.jpeg|miniaturadeimagen|centro|Trayectoria de un coche autónomo mediante las curvas de Bézier]] | ||
| + | |||
| + | === '''Fabricación automatizada''' === | ||
| + | En procesos como la impresión 3D y el corte por láser, las curvas de Bézier se utilizan para definir los patrones del movimiento que las herramientas deben seguir. | ||
| + | [[Archivo:Png-transparent-bezier-surface-bezier-curve-spline-others-angle-3d-computer-graphics-rectangle.png|miniaturadeimagen|centro|Modelización de una superficie mediante curvas de Bézier]] | ||
| + | |||
| + | ==== '''Impresión 3D''' ==== | ||
| + | En la impresión 3D, las superficies y trayectorias generadas por las curvas de Bézier son necesarias para lograr precisión y minimizar las discontinuidades entre capas. Por ejemplo, si se desea imprimir una prótesis, las curvas de Bézier ayudan a modelar de forma precisa la forma necesaria para que pueda ajustarse a la persona que lo necesita. | ||
| + | |||
| + | ==== '''Corte por láser''' ==== | ||
| + | En el corte de piezas metálicas o textiles, las curvas de Bézier permiten definir las trayectorias que las herramientas deben seguir para cortar con precisión. Por ejemplo, una máquina que fabrica piezas de aeronaves puede emplear estas curvas para cortar bordes suaves y redondeados en chapas de aluminio. | ||
| + | |||
| + | === '''Análisis de Superficies Complejas''' === | ||
| + | Las curvas de Bézier son empleadas para la creación de modelos tridimensionales. Podemos diferenciar dos tipos de modelos: los de estructuras y los de transportes. | ||
| + | ==== '''Construcción de estructuras''' ==== | ||
| + | En arquitectura, las curvas de Bézier ayudan a diseñar cubiertas de estadios o fachadas. Un ejemplo es el nuevo Santiago Bernabéu, cuya estructura curva ha sido diseñada mediante las curvas de Bézier. | ||
| + | [[Archivo:BernabeuBezier.png|miniaturadeimagen|centro|Diseño del Santiago Bernabéu usando las curvas de Bézier]] | ||
| + | |||
| + | ==== '''Diseño de automóviles y aeronaves''' ==== | ||
| + | Se emplean curvas y superficies de Bézier para diseñar formas aerodinámicas que mejoren la eficiencia del vehículo y la seguridad, aunque también para un mejor aprovechamiento de los materiales con los que se fabricará el vehículo. Por ejemplo, la carcasa de un coche que cubre la rueda por encima para protegerla de posibles golpes. | ||
| + | [[Archivo:Cochecitobezier.png|miniaturadeimagen|centro|Coche fabricado a partir de las curvas de Bézier]] | ||
Revisión actual del 00:20 10 dic 2024
| Trabajo realizado por estudiantes | |
|---|---|
| Título | Curvas de Bézier (Grupo 2) |
| Asignatura | Teoría de Campos |
| Curso | 2024-25 |
| Autores | Marta Escaso Camacho Maximiliano Rodríguez Ruiz Beatrice Laval González Alejandro Villaverde Carrascosa Daniel Pérez Cámara |
| Este artículo ha sido escrito por estudiantes como parte de su evaluación en la asignatura | |
Las curvas de Bézier son un sistema que se desarrolló sobre 1960 para el diseño aeronáutico, el trazado de dibujos técnicos y el diseño de automóviles. Fueron ideadas por el ingeniero francés Pierre Bézier y posteriormente desarrolladas por Paul de Casteljau. Hoy en día, estas curvas se han convertido en un estándar en la industria de la gráfica por computadora, el diseño industrial y la ingeniería, permitiendo crear formas fluidas y precisas. Las curvas de Bézier de orden [math]n[/math] están definidas por los puntos de control [math]P_0,P_1,...,P_n[/math] y se pueden expresar mediante la siguiente fórmula:
donde \(B_{i,n}(t)\) son los polinomios de Bernstein, dados por:
para \(t \in [0, 1]\), y donde \(\binom{n}{i}\) es el coeficiente binomial.
Contenido
- 1 Representación de la curva de Bézier cúbica para [math]n=3[/math], junto con la curva poligonal que conecta cuatro puntos de control coplanarios.
- 2 Representación del campo tangente [math]T(t)[/math] y del campo normal [math]N(t)[/math] en varios puntos de la curva.
- 3 Representación de la curvatura de la curva en función del parámetro [math]t[/math].
- 4 Animación del vector tangente, el vector normal y la circunferencia osculatriz asociados a cada punto de la curva de Bézier.
- 5 Representación de la curva de Bézier tridimensional, junto con la curva poligonal que conecta los cuatro puntos que están en el espacio tridimensional y no pertenecen al mismo plano.
- 6 Representación de los gráficos de la curvatura y de la torsión como funciones del parámetro [math]t[/math].
- 7 Animación que representa el triedro de Frenet que se mueve a lo largo de la curva.
- 8 Aplicación de una curva de Bézier al tramo de un circuito de [math]F_1[/math].
- 9 Aplicaciones de las curvas de Bézier en la ingeniería.
1 Representación de la curva de Bézier cúbica para [math]n=3[/math], junto con la curva poligonal que conecta cuatro puntos de control coplanarios.
En primer lugar se seleccionan cuatro puntos de control coplanarios ([math]P_0,P_1,P_2,P_3[/math]):
[math] \;\left\{\begin{matrix}P_0=(0,0) \\ P_1=(4,2) \\ P_2=(0,2) \\ P_3=(4,4) \end{matrix}\right.[/math]
Para calcular los puntos de la curva se utilizan los polinomios de Bernstein para cada valor de [math]i∈[/math] { [math]0,1,2,...,n[/math] } con [math]n=3[/math]:
[math] B_0=(1-t)^3 [/math]
[math] B_1=3(1-t)^2·t [/math]
[math] B_2=3(1-t)·t^2 [/math]
[math] B_3=t^3 [/math]
Se calcula la posición del punto en la curva mediante una combinación lineal de los puntos de control ponderados por los polinomios de Bernstein.
La imagen representa la gráfica de la curva de Bézier y la poligonal de control. Se puede observar cómo los puntos de control influyen en la forma de la curva, lo que permite adaptarla a distintas aplicaciones.
1.1 Código y representación
% Selección de puntos de control coplanarios
P0 = [0, 0, 0];
P1 = [4, 2, 0];
P2 = [0, 2, 0];
P3 = [4, 4, 0];
% Puntos para la curva de Bézier
numPuntos = 100;
% Valores de t entre 0 y 1
t = linspace(0, 1, numPuntos);
% Inicializar los puntos de la curva Bézier
puntosCurva = zeros(numPuntos, 3);
% Calcular los puntos de Bézier
for i = 1:numPuntos
% Polinomio de Bernstein
B0 = (1-t(i))^3;
B1 = 3 * (1-t(i))^2 * t(i);
B2 = 3 * (1-t(i)) * t(i)^2;
B3 = t(i)^3;
puntosCurva(i,:) = B0*P0 + B1*P1 + B2*P2 + B3*P3;
end
% Graficar la curva y la poligonal de control
figure;
hold on;
% Poligonal de control
plot3([ P0(1), P1(1), P2(1), P3(1) ], [ P0(2), P1(2), P2(2), P3(2) ], ...
[ P0(3), P1(3), P2(3), P3(3) ], 'bo--', 'LineWidth', 1.5);
% Curva de Bézier
plot3(puntosCurva(:,1), puntosCurva(:,2), puntosCurva(:,3), 'r-', 'LineWidth', 2.5);
% Se pone título a la gráfica
title('Curva de Bézier cúbica');
% Se pone nombre a los ejes
xlabel('Eje x');
ylabel('Eje y');
legend('Poligonal de control', 'Curva Bézier');
grid on;
hold off;
2 Representación del campo tangente [math]T(t)[/math] y del campo normal [math]N(t)[/math] en varios puntos de la curva.
2.1 Cálculo del Vector Tangente [math]T(t)[/math]:
El vector tangente [math]T(t)[/math] es la derivada de la curva \(B(t)\) respecto al parámetro [math]t[/math]:
donde la derivada del polinomio de Bernstein es:
El vector tangente se obtiene normalizando la derivada:
donde [math]||B'(t)||=\sqrt{(B'_x(t))^2 + (B'_y(t))^2} [/math]
2.2 Cálculo del Vector Normal [math]N(t)[/math]:
Como el vector normal es ortogonal al vector tangente, lo calculamos haciendo uso del tensor rotación [math]R[/math] con eje unitario y ángulo 90º ([math]\frac{\pi}{2}[/math] radianes).
La fórmula general para una rotación alrededor de un eje [math]e[/math] unitario con un ángulo [math]θ[/math] es:
Particularizando para [math] e_z=\begin{pmatrix} 0 \\ 0 \\ 1 \end{pmatrix} [/math]:
Para rotaciones en el plano XY, es decir, 2D:
2.3 Código y representación
% Vector de puntos de control coplanarios
P = [0, 0; 4, 2; 0, 2; 4, 4];
n = 3; % Orden de la curva de Bézier
% Puntos para la curva de Bézier
numPuntos = 100;
t = linspace(0, 1, numPuntos); % Valores de t entre 0 y 1
B = zeros(numPuntos, 2); % Inicializar B con la matriz nula
dB = zeros(numPuntos, 2); % Derivada de la curva
% Cálculo de la curva y derivada
for i = 0:n
coefBin = nchoosek(n, i); % Coeficiente binomial
Bernstein = coefBin * (t.^i) .* ((1-t).^(n-i)); % Polinomio de Bernstein
BernsteinDerivada = coefBin * (i * t.^(i-1) .* (1-t).^(n-i) - (n-i) * t.^i .* (1-t).^(n-i-1)); % Derivada
B = B + Bernstein' * P(i+1, :); % Curva de Bézier
dB = dB + BernsteinDerivada' * P(i+1, :); % Derivada
end
% Obtenemos el vector tangente
T = dB ./ vecnorm(dB, 2, 2);
% Definimos la matriz de rotación para 90º alrededor del eje Z
R = [0 -1; 1 0];
% Cálculo del vector normal usando R
N = (R * T')';
% Puntos de la curva para dibujar vectores tangentes y normales
puntos = round(linspace(1, numPuntos, 12)); % Seleccionamos 12 puntos
% Graficar la curva y la poligonal de control
figure;
hold on;
plot(P(:, 1), P(:, 2), 'bo--', 'LineWidth', 1.5); % Poligonal de control
plot(B(:, 1), B(:, 2), 'r-', 'LineWidth', 2.5); % Curva Bézier
% Graficar vectores tangentes y normales
quiver(B(puntos, 1), B(puntos, 2), T(puntos, 1), T(puntos, 2), 0.3, 'g', 'LineWidth', 1); % Tangentes (en verde)
quiver(B(puntos, 1), B(puntos, 2), N(puntos, 1), N(puntos, 2), 0.3, 'm', 'LineWidth', 1); % Normales (en magenta)
title('Campos tangente y normal');
xlabel('Eje x');
ylabel('Eje y');
legend('Poligonal de control', 'Curva Bézier', 'Tangentes', 'Normales');
grid on;
hold off;
3 Representación de la curvatura de la curva en función del parámetro [math]t[/math].
La curvatura es una medida del cambio de dirección del vector tangente a una curva, cuanto más rápido cambia este a medida que nos desplazamos a lo largo de la curva, se dice que es más grande la curvatura. Se puede expresar como una función del parámetro [math]t[/math], que generalmente parametriza la curva. En este apartado se usará su parametrización para representar el gráfico de la curvatura de la curva en los cuatro siguientes puntos: [math] P_0=(0,0)[/math] , [math]P_1=(4,2)[/math] , [math]P_2=(0,2)[/math] y [math]P_3=(4,4) [/math].
Se utilizarán los polinomios de Berstein para poder calcular la posición de cada punto de la curva que se define como: [math] B(t) = (x(t), y(t)) [/math]. Posteriormente será necesario calcular las derivadas de primer y segundo orden en función del parámetro [math]t[/math] tanto de [math]x[/math] como de [math]y[/math] y se calculará la curvatura mediante la siguiente fórmula:
3.1 Código y representación
% Selección de puntos de control coplanarios
P0 = [0, 0, 0];
P1 = [4, 2, 0];
P2 = [0, 2, 0];
P3 = [4, 4, 0];
% Puntos para la curva de Bézier
numPuntos = 100;
% Valores de t entre 0 y 1
t = linspace(0, 1, numPuntos);
% Inicializar los puntos de la curva Bézier
puntosCurva = zeros(numPuntos, n);
% Calcular los puntos de Bézier
for i = 1:numPuntos
% Polinomio de Bernstein
B0 = (1-t(i))^3;
B1 = 3 * (1-t(i))^2 * t(i);
B2 = 3 * (1-t(i)) * t(i)^2;
B3 = t(i)^3;
puntosCurva(i,:) = B0*P0 + B1*P1 + B2*P2 + B3*P3;
end
% Derivar las coordenadas de la curva con respecto a t
% Aproximación por diferencias finitas
dx = gradient(puntosCurva(:, 1), t); % Primera derivada de x
dy = gradient(puntosCurva(:, 2), t); % Primera derivada de y
d2x = gradient(dx, t); % Segunda derivada de x
d2y = gradient(dy, t); % Segunda derivada de y
% Calcular la curvatura usando la fórmula
curvatura = abs(dx .* d2y - dy .* d2x) ./ ((dx.^2 + dy.^2).^(3/2));
% Graficar la curvatura en función del parámetro t
plot(t, curvatura, 'r-', 'LineWidth', 2);
title('Curvatura de la curva de Bézier en función de t');
xlabel('Eje x');
ylabel('Eje y');
4 Animación del vector tangente, el vector normal y la circunferencia osculatriz asociados a cada punto de la curva de Bézier.
Para poder calcular el vector tangente, el vector normal y la circunferencia osculatriz a medida que nos movemos a lo largo de una curva de Bézier es importante entender cómo se define la curva y cómo obtener las propiedades geométricas pedidas a partir de las propiedades de las derivadas de la curva.
4.1 Curva de Bézier y su derivada
Como bien dice el enunciado, consideraremos una curva de Bézier de orden n definida por el conjunto de puntos de control { [math]P_0,P_1,P_2,P_3[/math]}. La fórmula paramétrica sería:
donde [math]B_{i,n}(t)[/math] son los polinomios de Bernstein y [math]t[/math] es el parámetro que varía entre 0 y 1. Los polinomios están dados por:
para \(t \in [0, 1]\), y donde \(\binom{n}{i}\) es el coeficiente binomial.
En este caso se han usado los siguientes puntos:
[math] \;\left\{\begin{matrix}P_0=(0,0,0) \\ P_1=(4,2,0) \\ P_2=(0,2,0) \\ P_3=(4,4,0) \end{matrix}\right.[/math]
La curva de Bézier quedaría de la siguiente forma:
[math] B(t) = (1 − t)^{3}·P_0 + 3(1 − t)^{2}·t·P_1 + (1 − t)^{2}·t^{2}·P_2 + t^{3}·P_3 [/math]
4.2 Vector Tangente (Primera Derivada)
El vector tangente en un punto [math]t[/math] es el vector que indica la dirección en la que se mueve la curva cuando [math]t[/math] cambia. Para obtenerlo, calcularemos la primera derivada de la curva de Bézier mediante:[math]B'(t) = 3(1 − t)^{2}·(P_1 - P_0) + 6(1 − t)·t·(P_2 - P_1) + 3t^{2}·(P_3 - P_2) [/math]
Sustituyendo según los valores:
[math]B'(t) = 3(1 − t)^{2}·[4,2,0] + 6(1 − t)·t·[-4,0,,0] + 3t^{2}·[4,2,0] [/math]
Este vector apunta en la dirección de la tangente a la curva.
4.3 Vector Normal (Segunda Derivada)
El vector normal es perpendicular al vector tangente y apunta en la dirección en la que la curva se "curva". Para obtener el vector normal, primero necesitas la segunda derivada de la curva:
Entonces,
[math]B''(t) = 6(1 − t)·(P_1 - P_0) + 6[2(1 − t)-2t]·(P_2 - P_1) + 6t·(P_3 - P_2) [/math]
Sustituyendo y simplificando,
[math]B''(t) = 6(1 − t)·[4,2,0] + 6(2-4t)·[-4,0,0] + 6t·[4,2,0] [/math]
Es importante tener en cuenta que [math]N(t)[/math] está asociado con el cambio de dirección del vector tangente.
4.4 Circunferencia Osculatriz
La circunferencia osculatriz en un punto dado de la curva es el círculo que tiene la misma tangente y curvatura que la curva en ese punto. Para hallar la ecuación de esta circunferencia necesitamos calcular tres variables:
4.4.1 Centro de la circunferencia osculatriz:
Se puede obtener a partir de la curvatura y los vectores tangente y normal. Este centro está ubicado a una distancia [math]R[/math] del punto [math]B(t)[/math], donde [math]R[/math] es el radio de curvatura, que se puede calcular como:4.4.2 Posición del centro
El centro de la circunferencia está desplazado desde el punto [math]B(t)[/math] a lo largo del vector normal [math]N(t)[/math] a una distancia [math]R[/math]. Entonces, la posición del centro de la circunferencia osculatriz es:4.4.3 Ecuación de la circunferencia:
La ecuación de la circunferencia en el plano es:dónde [math]r(t)[/math] es cualquier punto sobre la circunferencia.
4.5 Código y animación
% Puntos de control para una curva de Bézier cúbica
P0 = [0, 0,0];
P1 = [4, 2,0];
P2 = [0, 2,0];
P3 = [4, 4,0];
% Valor del parámetro t[0,1]
t = linspace(0, 1, 100);
% Componentes de la función para calcularnos el polinomio de Bernstein
B0 = (1 - t).^3;
B1 = 3 * t .* (1 - t).^2;
B2 = 3 * t.^2 .* (1 - t);
B3 = t.^3;
% Coordenadas de la curva de Bézier
x = B0 * P0(1) + B1 * P1(1) + B2 * P2(1) + B3 * P3(1);
y = B0 * P0(2) + B1 * P1(2) + B2 * P2(2) + B3 * P3(2);
% Funciones para calcularnos las derivadas de la curva
dx = gradient(x, t);
dy = gradient(y, t);
% Cálculo del vector tangente
T = [dx; dy] ./ sqrt(dx.^2 + dy.^2);
% Cálculo del vector normal (perpendiculares al tangente)
N = [-T(2, :); T(1, :)];
% Funciones para calcularnos las segundas derivadas
ddx = gradient(dx, t);
ddy = gradient(dy, t);
% Curvatura
curvatura = abs(dx .* ddy - dy .* ddx) ./ (dx.^2 + dy.^2).^(3/2);
% Radio de la circunferencia osculatriz
if curvatura ~= 0
R = 1 ./ curvatura;
else
R = Inf;
end
% Estructura de la animación
figure;
for i = 1:length(t)
clf;
plot(x, y, 'r--', 'LineWidth', 2);
hold on;
quiver(x(i), y(i), T(1, i), T(2, i), 0.5, 'g', 'LineWidth', 1.5); % Tangente
quiver(x(i), y(i), N(1, i), N(2, i), 0.5, 'm', 'LineWidth', 1.5); % Normal
% Centro de la circunferencia osculatriz y gráfica
center = [x(i), y(i)] + R(i) * N(:, i)';
theta = linspace(0, 2*pi, 100);
circle_x = center(1) + R(i) * cos(theta);
circle_y = center(2) + R(i) * sin(theta);
plot(circle_x, circle_y, 'b','LineWidth', 1.25);
title('Curva de Bézier: Tangente, Normal y Circunferencia Osculatriz');
xlabel('X');
ylabel('Y');
axis equal; grid on;
pause(0.08);
end
5 Representación de la curva de Bézier tridimensional, junto con la curva poligonal que conecta los cuatro puntos que están en el espacio tridimensional y no pertenecen al mismo plano.
Para calcular y representar la curva de Bézier tridimensional que conecta los puntos {[math]P_0[/math], [math]P_1[/math], [math]P_2[/math], [math]P_3[/math]} siendo entre ellos no coplanarios, hemos utilizado la curva de Bézier cúbica; extendiéndola al espacio 3D. La diferencia principal es que los puntos de control están en [math]ℝ^{3}[/math], por lo que las coordenadas [math]x[/math], [math]y[/math], [math]z[/math] de cada punto de la curva serán calculadas en función de esas dimensiones.
Para el cálculo de la curva poligonal simplemente se hace una serie de líneas rectas que conectan los puntos de control {[math]P_0[/math], [math]P_1[/math], [math]P_2[/math], [math]P_3[/math]} y se ha representado como un conjunto de segmentos de línea entre estos puntos.
Los puntos que se han elegido para este apartado son:
[math] \;\left\{\begin{matrix}P_0=(0,0,0) \\ P_1=(2,3,1) \\ P_2=(4,1,3) \\ P_3=(6,4,0) \end{matrix}\right.[/math]
5.1 Código y representación
% Curva de Bézier Cúbica en 3D
% Demuestra una curva de Bézier con puntos de control no coplanares
% Definición de puntos de control en el espacio 3D
% Elegimos puntos que claramente no están en el mismo plano
P0 = [0, 0, 0]; % Origen
P1 = [2, 3, 1]; % Primer punto de control con elevación
P2 = [4, 1, 3]; % Segundo punto de control con diferente elevación
P3 = [6, 4, 0]; % Punto final con variación en z
% Matriz de puntos de control
puntosControl = [P0; P1; P2; P3];
% Función para calcular punto de Bézier
function P = puntoBezier(puntosControl, t)
n = size(puntosControl, 1) - 1;
P = zeros(1, 3);
for i = 0:n
b = nchoosek(n, i) * (t^i) * ((1-t)^(n-i));
P = P + b * puntosControl(i+1, :);
end
end
% Generar puntos de la curva
numPuntos = 100;
t = linspace(0, 1, numPuntos);
puntosCurva = zeros(numPuntos, 3);
for i = 1:numPuntos
puntosCurva(i, :) = puntoBezier(puntosControl, t(i));
end
% Configuración de la visualización
figure;
hold on;
grid on;
axis equal;
% Gráfico de la curva de Bézier
plot3(puntosCurva(:,1), puntosCurva(:,2), puntosCurva(:,3), 'r-', 'LineWidth', 2);
% Gráfico de la curva poligonal (polígono de control)
plot3(puntosControl(:,1), puntosControl(:,2), puntosControl(:,3), 'bo--', 'LineWidth', 1.5);
% Decorar los puntos de control
scatter3(puntosControl(:,1), puntosControl(:,2), puntosControl(:,3), 100, 'r', 'filled');
% Etiquetar los puntos de control
labels = {'P0', 'P1', 'P2', 'P3'};
for i = 1:length(labels)
text(puntosControl(i,1), puntosControl(i,2), puntosControl(i,3), ...
labels{i}, 'FontSize', 10, 'FontWeight', 'bold');
end
% Configuraciones finales de la figura
title('Curva de Bézier Cúbica en 3D');
xlabel('Eje X');
ylabel('Eje Y');
zlabel('Eje Z');
view(45, 65); % Ángulo de vista para mejor perspectiva 3D
legend('Curva de Bézier', 'Polígono de Control');
hold off;
% Información adicional sobre los puntos de control
disp('Puntos de Control:');
for i = 1:size(puntosControl, 1)
fprintf('P%d: [%.2f, %.2f, %.2f]\n', i-1, puntosControl(i,:));
end
6 Representación de los gráficos de la curvatura y de la torsión como funciones del parámetro [math]t[/math].
Una vez la curva de Bézier tridimensional junto a su curva poligonal han sido representadas, se continuará con la representación de la curvatura y la torsión como funciones del parámetro [math]t[/math].
6.1 Curvatura:
Empezando por la curvatura ([math]\kappa(t)[/math]), que marca cuanto se desvía la recta tangente a lo largo de la curva, que en otras palabras sería cuánto cambia la curvatura en el plano, y se calcula en función de la siguiente expresión:
Siendo [math] \mathbf{B}'(t) [/math] la primera derivada de la curva en función de [math]t[/math], y [math] \mathbf{B}''(t) [/math] la segunda derivada en funcón de [math] t [/math].
Por tanto , [math] \|\mathbf{B}'(t) \times \mathbf{B}''(t)\| [/math] equivale a la norma del producto mixto de la primera y la segunda derivada de la curva [math] \mathbf{B}(t) [/math].
6.2 Torsión:
Por otro lado, encontramos la torsión([math] \tau(t)[/math]) que mide cuánto cambia la orientación del plano tangente a lo largo de la curva, y sigue la siguiente expresión:
Dónde [math] \mathbf{B}'(t) [/math] vuelve a ser la primera derivada de la curva en función de [math]t[/math], y [math] \mathbf{B}''(t) [/math] la segunda derivada de la curva en función de [math] t [/math], además, aparece también [math] \mathbf{B}'''(t) [/math] que sería la tercera derivada de la curva.
Como se puede observar en la expresión, hay un producto vectorial por un producto escalar, eso se convierte en un producto mixto y se resuelve como el determinante de las tres derivadas de la curva, en este caso como se ve en el desarrollo de la expresión.
6.3 Código y representación de la curva de Bézier, su curvatura y torsión en función de [math] t [/math]:
% Puntos de control en R3 (no coplanarios)
P = [0 0 0; 2 3 1; 4 1 3; 6 4 0];
% Número de puntos para la curva
n = 100;
t = linspace(0, 1, n);
% Inicializamos la curva de Bézier
curve = zeros(n, 3);
% Calculamos los puntos de la curva de Bézier
for i = 1:size(P, 1)
curve = curve + bernstein(i-1, size(P, 1)-1, t)' .* P(i, :);
end
% Primera derivada
d1 = zeros(n, 3);
for i = 1:size(P, 1)-1
d1 = d1 + (size(P, 1)-1) * bernstein(i-1, size(P, 1)-2, t)' .* (P(i+1, :) - P(i, :));
end
% Segunda derivada
d2 = zeros(n, 3);
for i = 1:size(P, 1)-2
d2 = d2 + (size(P, 1)-1)*(size(P, 1)-2) * bernstein(i-1, size(P, 1)-3, t)' .* ...
(P(i+2, :) - 2*P(i+1, :) + P(i, :));
end
% Tercera derivada (para calcular la torsión)
d3 = zeros(n, 3);
for i = 1:size(P, 1)-3
d3 = d3 + (size(P, 1)-1)*(size(P, 1)-2)*(size(P, 1)-3) * bernstein(i-1, size(P, 1)-4, t)' .* ...
(P(i+3, :) - 3*P(i+2, :) + 3*P(i+1, :) - P(i, :));
end
% Calculamos la curvatura
tangent = d1 ./ vecnorm(d1, 2, 2);
curvature = vecnorm(cross(d1, d2), 2, 2) ./ (vecnorm(d1, 2, 2).^3);
% Calculamos la torsión
torsion = zeros(n, 1);
for i = 1:n
torsion(i) = dot(cross(d1(i,:), d2(i,:)), d3(i,:)) / norm(cross(d1(i,:), d2(i,:)))^2;
end
% Trazamos la gráfica
figure('Position', [100, 100, 1200, 800]);
% Curva 3D con polígono de control
subplot(2, 2, [1 3]);
% Curva de Bézier
plot3(curve(:,1), curve(:,2), curve(:,3), 'r-', 'LineWidth', 2);
hold on;
% Polígono de control
plot3(P(:,1), P(:,2), P(:,3), 'bo--');
title('Curva de Bézier');
xlabel('Eje X'); ylabel('Eje Y'); zlabel('Eje Z');
grid on;
view(45, 30);
% Etiquetar los puntos de control
labels = {' P0', ' P1', ' P2', ' P3'};
for i = 1:length(labels)
text(matrizPuntos(i,1), matrizPuntos(i,2), matrizPuntos(i,3), ...
labels{i}, 'FontSize', 10, 'FontWeight', 'bold');
end
% Gráfico de curvatura
subplot(2, 2, 2);
plot(t, curvature, 'r-', 'LineWidth', 2);
title('Curvatura');
xlabel('t'); ylabel('Curvatura');
grid on;
% Gráfico de torsión
subplot(2, 2, 4);
plot(t, torsion, 'b-', 'LineWidth', 2);
title('Torsión');
xlabel('t'); ylabel('Torsión');
grid on;
sgtitle('Curvatura y torsión en función de t');
% Función para trabajar con el polinomio de Bernstein
function b = bernstein(i, n, t)
b = nchoosek(n, i) * (t.^i) .* ((1-t).^(n-i));
end
7 Animación que representa el triedro de Frenet que se mueve a lo largo de la curva.
Tras haber representado la curva, pasamos al triedro de Frenet que es un conjunto de tres vectores que se utilizan para describir el comportamiento geométrico de una curva en el espacio tridimensional. Estos vectores son:
el vector [math] \overrightarrow{T} [/math] que hace referencia al vector tangente a lo largo de la curva [math] \mathbf{B}(t) [/math]
el vector [math] \overrightarrow{n} [/math] que es el vector normal que esta orientado a la dirección en la que está curvando cada punto de la curva [math] \mathbf{B}(t) [/math]
y por último, el vector [math] \overrightarrow{BN} [/math] que es es vector binormal y es perpendicular a [math] \overrightarrow{T} [/math] y [math] \overrightarrow{N} [/math], y se calcula tal que : [math] \overrightarrow{BN} = {\overrightarrow{T} \times \overrightarrow{N}} [/math]
Una vez definido lo que es y los vectores que lo componen, se representa, gracias al programa MATLAB, una animación del Triedro de Frenet a lo largo de la curva, dónde se utilizó el siguiente código para su realización:
7.1 Código y animación
% Puntos de control en R3 (no coplanarios)
P = [0 0 0; 1 2 1; 3 1 2; 4 3 3];
% Número de puntos
n = 100;
t = linspace(0, 1, n);
% Puntos de la curva de Bézier
curva = zeros(n, 3);
for i = 1:size(P, 1)
curva = curva + bernstein(i-1, size(P, 1)-1, t)' .* P(i, :);
end
% Primera derivada
d1 = zeros(n, 3);
for i = 1:size(P, 1)-1
d1 = d1 + (size(P, 1)-1) * bernstein(i-1, size(P, 1)-2, t)' .* (P(i+1, :) - P(i, :));
end
% Segunda derivada
d2 = zeros(n, 3);
for i = 1:size(P, 1)-2
d2 = d2 + (size(P, 1)-1)*(size(P, 1)-2) * bernstein(i-1, size(P, 1)-3, t)' .* ...
(P(i+2, :) - 2*P(i+1, :) + P(i, :));
end
% Triedro de Frenet
tangente = d1 ./ vecnorm(d1, 2, 2);
normal = cross(d2, d1) ./ (vecnorm(d1, 2, 2).^2);
binormal = cross(tangente, normal);
% Normalizar los vectores
normal = normal ./ vecnorm(normal, 2, 2);
binormal = binormal ./ vecnorm(binormal, 2, 2);
% Preparar la animación
figure('Position', [100, 100, 1000, 800]);
axis equal;
hold on;
grid on;
% Graficar la curva de Bézier
plot3(curva(:,1), curva(:,2), curva(:,3), 'r-', 'LineWidth', 2.5);
plot3(P(:,1), P(:,2), P(:,3), 'bo--');
% Animación del triedro de Frenet
title('Animación del Triedro de Frenet');
xlabel('Eje X'); ylabel('Eje Y'); zlabel('Eje Z');
% Longitud de los vectores para la visualización
longitud_vectores = 0.5;
% Crear líneas para los vectores
linea_tangente = line([0 0], [0 0], [0 0], 'Color', 'g', 'LineWidth', 2);
linea_normal = line([0 0], [0 0], [0 0], 'Color', 'c', 'LineWidth', 2);
linea_binormal = line([0 0], [0 0], [0 0], 'Color', 'm', 'LineWidth', 2);
% Animación
view(80, 60);
for i = 1:n
% Actualizar las líneas de los vectores
set(linea_tangente, 'XData', [curva(i,1), curva(i,1) + longitud_vectores*tangente(i,1)], ...
'YData', [curva(i,2), curva(i,2) + longitud_vectores*tangente(i,2)], ...
'ZData', [curva(i,3), curva(i,3) + longitud_vectores*tangente(i,3)]);
set(linea_normal, 'XData', [curva(i,1), curva(i,1) + longitud_vectores*normal(i,1)], ...
'YData', [curva(i,2), curva(i,2) + longitud_vectores*normal(i,2)], ...
'ZData', [curva(i,3), curva(i,3) + longitud_vectores*normal(i,3)]);
set(linea_binormal, 'XData', [curva(i,1), curva(i,1) + longitud_vectores*binormal(i,1)], ...
'YData', [curva(i,2), curva(i,2) + longitud_vectores*binormal(i,2)], ...
'ZData', [curva(i,3), curva(i,3) + longitud_vectores*binormal(i,3)]);
drawnow;
pause(0.05);
end
% Función para calcular el coeficiente binomial
function b = coefBin(n, k)
b = factorial(n) / (factorial(k) * factorial(n-k));
end
% Función para calcular el polinomio de Bernstein
function b = bernstein(i, n, t)
b = coefBin(n, i) * (t.^i) .* ((1-t).^(n-i));
end
8 Aplicación de una curva de Bézier al tramo de un circuito de [math]F_1[/math].
8.1 Condiciones
La velocidad escalar constante [math]ν_0[/math] que debe mantener un Ferrari F2004 para no salirse de la pista en ningún punto de un circuito con el trazado de una curva de Bézier, debe ser tal que la fuerza centrípeta [math]F_c=mκν^2[/math] no exceda la fuerza máxima de fricción [math]F_{\text{fricción}}=μmg[/math].
Siendo [math]m[/math] la masa del Ferrari, [math]κ[/math] la curvatura de la pista, [math]g[/math] la aceleración de la gravedad y [math]μ[/math] el coeficiente de fricción entre los neumáticos y la pista (se asume igual a 1.5).
8.2 Cálculo analítico de la velocidad escalar constante [math]ν_0[/math]
Esto implica que [math]F_c≤F_{\text{fricción}}→κν^2≤μg[/math]
Para que la velocidad sea constante y segura se tomará el valor máximo de [math]κ(t)[/math] a lo largo del intervalo [math]t∈[0,1][/math]. Así pues: [math]ν_0≤\sqrt{\frac{μg}{κ_{\text{máx}}}}[/math]
Como ya se ha mencionado en apartados anteriores, para calcular la curvatura [math]κ(t)[/math] se necesitan la primera y la segunda derivada de [math]B[/math]: [math] \kappa(t) = \frac{\|\mathbf{B}'(t) \times \mathbf{B}''(t)\|}{\|\mathbf{B}'(t)\|^3} [/math]
Siendo B para [math]n=3[/math] (por la fórmula general de las curvas de Bézier): [math]B=(1-t)^3P_0+3t(1-t)^2P_1+3t^2(1-t)P_2+t^3P_3[/math]
Además se tendrán en cuenta los siguientes puntos de control: [math]P_0 =[0,0,0], P_1 = [30,50,5], P_2 = [60,−30,−10], P_3 = [100,0,0][/math].
Analizando el problema con la animación 3D de la curva que se muestra más abajo, el programa nos devuelve el valor máximo de velocidad escalar constante posible para que el Ferrari no se salga de la pista: [math]24,1569[/math] [math]m/s[/math]
8.3 Aceleración centrípeta y su vector director
Por otro lado, la aceleración centrípeta es: [math]a_c=\frac{ν_0^2}{r}[/math]. Sabiendo que: [math]r=\frac{1}{κ(t)}[/math]. Entonces: [math]a_c=ν_0^2·κ(t)[/math]
Si esta se multiplica por el vector normal unitario a la curva de Bézier, se obtiene el vector aceleración centrípeta en la animación (radial, siempre apuntando al centro de la curvatura y perpendicular a la velocidad, que es tangencial)
8.4 Código y animación
% Puntos de control
P0 = [0, 0, 0];
P1 = [30, 50, 5];
P2 = [60, -30, -10];
P3 = [100, 0, 0];
% Constantes
mu = 1.5; % Coeficiente de fricción
g = 9.81; % Aceleración gravitatoria (m/s^2)
% Funciones de la curva de Bézier y derivadas
function B = bezier(t, P0, P1, P2, P3)
B = (1 - t)^3 * P0 + 3 * t * (1 - t)^2 * P1 + 3 * t^2 * (1 - t) * P2 + t^3 * P3;
end
function Bp = bezier_prime(t, P0, P1, P2, P3)
Bp = -3 * (1 - t)^2 * P0 + (3 * (1 - t)^2 - 6 * t * (1 - t)) * P1 ...
+ (6 * t * (1 - t) - 3 * t^2) * P2 + 3 * t^2 * P3;
end
function Bpp = bezier_double_prime(t, P0, P1, P2, P3)
Bpp = 6 * (1 - t) * P0 + (6 - 12 * t) * P1 + (6 * t - 12 * t + 6) * P2 - 6 * t * P3;
end
function k = curvature(t, P0, P1, P2, P3)
Bp = bezier_prime(t, P0, P1, P2, P3);
Bpp = bezier_double_prime(t, P0, P1, P2, P3);
cross_prod = norm(cross(Bp, Bpp));
norm_Bp = norm(Bp);
if norm_Bp == 0
k = 0;
else
k = cross_prod / (norm_Bp^3);
end
end
% Discretización de la curva
t_values = linspace(0, 1, 500);
curve = arrayfun(@(t) bezier(t, P0, P1, P2, P3), t_values, 'UniformOutput', false);
curve = cell2mat(curve')';
% Cálculo de la curvatura
curvatures = arrayfun(@(t) curvature(t, P0, P1, P2, P3), t_values);
% Velocidad máxima segura
kappa_max = max(curvatures);
v0 = sqrt(mu * g / kappa_max);
% Mostrar resultado
disp(['Velocidad máxima segura (v0): ', num2str(v0), ' m/s']);
% Crear figura
figure;
hold on;
grid on;
plot3(curve(1, :), curve(2, :), curve(3, :), 'b-', 'LineWidth', 2);
title('Curva de Bézier y animación del coche');
xlabel('X (m)');
ylabel('Y (m)');
zlabel('Z (m)');
view(3); % Vista 3D
% Congelar los límites de los ejes
axis([min(curve(1, :)) max(curve(1, :)) ...
min(curve(2, :)) max(curve(2, :)) ...
min(curve(3, :)) max(curve(3, :))]);
% Crear los vectores para animación
h_vel = quiver3(0, 0, 0, 0, 0, 0, 'r', 'LineWidth', 2); % Vector velocidad
h_ac = quiver3(0, 0, 0, 0, 0, 0, 'g', 'LineWidth', 2); % Vector aceleración centrípeta
% Animar la curva
for i = 1:10:length(t_values) % Aumentar el paso para controlar la velocidad de animación
t = t_values(i);
% Posición, velocidad y aceleración centrípeta
pos = bezier(t, P0, P1, P2, P3);
Bp = bezier_prime(t, P0, P1, P2, P3);
Bpp = bezier_double_prime(t, P0, P1, P2, P3);
% Dirección del vector normal (centrípeta)
normal_vec = cross(Bp, Bpp);
normal_vec = normal_vec / norm(normal_vec); % Normalizar
ac = curvature(t, P0, P1, P2, P3) * v0^2 * normal_vec;
% Actualizar la posición de los vectores
set(h_vel, 'XData', pos(1), 'YData', pos(2), 'ZData', pos(3), ...
'UData', Bp(1), 'VData', Bp(2), 'WData', Bp(3));
set(h_ac, 'XData', pos(1), 'YData', pos(2), 'ZData', pos(3), ...
'UData', ac(1), 'VData', ac(2), 'WData', ac(3));
% Pausa para crear la animación
pause(0.05);
end
legend('Curva Bézier', 'Velocidad', 'Aceleración centrípeta');
hold off;
9 Aplicaciones de las curvas de Bézier en la ingeniería.
Las curvas de Bézier son herramientas matemáticas que se utilizan en diversas áreas de la ingeniería por su capacidad para representar trayectorias, modelar superficies complejas y generar movimientos precisos. En la ingeniería podemos ver diferentes aplicaciones:
9.1 Modelización de trayectorias
Se utilizan para diseñar trayectorias óptimas en diversos sistemas automatizados como la robótica o los vehículos autónomos:
9.1.1 Robótica
En robótica, las curvas de Bézier se utilizan para planificar trayectorias de movimientos de brazos robóticos. Por ejemplo, un brazo robótico que ensambla las partes de un producto utiliza estas curvas para una trayectoria óptima en la que no haya colisiones o movimientos bruscos.
9.1.2 Vehículos autónomos
Las curvas de Bézier permiten calcular las rutas más seguras entre obstáculos en tiempo real. Por ejemplo, los vehículos Tesla tienen una conducción autónoma donde utilizan estas curvas para planificar la trayectoria, optimizar el consumo energético y evitar colisiones.
9.2 Fabricación automatizada
En procesos como la impresión 3D y el corte por láser, las curvas de Bézier se utilizan para definir los patrones del movimiento que las herramientas deben seguir.
9.2.1 Impresión 3D
En la impresión 3D, las superficies y trayectorias generadas por las curvas de Bézier son necesarias para lograr precisión y minimizar las discontinuidades entre capas. Por ejemplo, si se desea imprimir una prótesis, las curvas de Bézier ayudan a modelar de forma precisa la forma necesaria para que pueda ajustarse a la persona que lo necesita.
9.2.2 Corte por láser
En el corte de piezas metálicas o textiles, las curvas de Bézier permiten definir las trayectorias que las herramientas deben seguir para cortar con precisión. Por ejemplo, una máquina que fabrica piezas de aeronaves puede emplear estas curvas para cortar bordes suaves y redondeados en chapas de aluminio.
9.3 Análisis de Superficies Complejas
Las curvas de Bézier son empleadas para la creación de modelos tridimensionales. Podemos diferenciar dos tipos de modelos: los de estructuras y los de transportes.
9.3.1 Construcción de estructuras
En arquitectura, las curvas de Bézier ayudan a diseñar cubiertas de estadios o fachadas. Un ejemplo es el nuevo Santiago Bernabéu, cuya estructura curva ha sido diseñada mediante las curvas de Bézier.
Se emplean curvas y superficies de Bézier para diseñar formas aerodinámicas que mejoren la eficiencia del vehículo y la seguridad, aunque también para un mejor aprovechamiento de los materiales con los que se fabricará el vehículo. Por ejemplo, la carcasa de un coche que cubre la rueda por encima para protegerla de posibles golpes.
