Curvas de Bezier Grupo 17

De MateWiki
Revisión del 23:37 9 dic 2024 de Alvaro Roman Aguilera (Discusión | contribuciones) (Curva de Bézier tridimensional y curva poligonal)

Saltar a: navegación, buscar

Las curvas de Bézier llevan el nombre del ingeniero francés Pierre Bézier, quien las publicó en 1962 y, posteriormente, trabajando en Renault, las utilizó ampliamente en el diseño de las distintas partes del automóvil. 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 n están definidas por los puntos de control P0,P1,...,Pn y se pueden expresar mediante la siguiente fórmula:

[math] \sum_{i=0}^n B_{i,n}(t) P_i\ [/math]

donde los coeficientes \(B_{i,n}(t)\) son los polinomios de Bernstein, dados por:

[math] B_{i,n}(t) = \binom{n}{i} t^i (1-t)^{n-i}\ [/math]

para \(t \in [0, 1]\), y donde \(\binom{n}{i}\) es el coeficiente binomial.


Trabajo realizado por estudiantes
Título Curvas de Bézier. Grupo 17
Asignatura Teoría de Campos
Curso 2024-25
Autores Alejandra García-Agulló Canle
Fernando Barbancho Lara
Álvaro Román Aguilera
Jaime García Alegre
Este artículo ha sido escrito por estudiantes como parte de su evaluación en la asignatura



1 Curva de Bézier cúbica (n=3)

Una curva de Bézier cúbica es un caso especial de las curvas de Bézier que utiliza 4 puntos de control (P0, P1, P2, P3).

La fórmula para calcular esta curva es:
[math] B(t) = (1-t)^3P_0 + 3t(1-t)^2P_1 + 3t^2(1-t)P_2 + t^3P_3, \; t \in [0,1] [/math]

O la podemos expresar por componentes en la base física cartesiana [math] \left[ \mathbf{x}, \mathbf{y}, \mathbf{z} \right] [/math] de la forma:

[math] x(t) = (1 - t)^3 P_{0x} + 3(1 - t)^2 t P_{1x} + 3(1 - t) t^2 P_{2x} + t^3 P_{3x}[/math]

[math] y(t) = (1 - t)^3 P_{0y} + 3(1 - t)^2 t P_{1y} + 3(1 - t) t^2 P_{2y} + t^3 P_{3y}[/math]

[math] z(t) = (1 - t)^3 P_{0z} + 3(1 - t)^2 t P_{1z} + 3(1 - t) t^2 P_{2z} + t^3 P_{3z}.[/math]

A la hora de elegir los puntos coplanarios, hemos elegido los siguientes puntos:
[math] P0=(0,0,0),P1=(1,2,0),P2=(3,3,0),P3=(4,0,0) [/math].

Estos puntos son coplanarios en el plazo z=0 y además tienen características que permiten visualizar una curva de Bézier cúbica con una forma interesante, sin complicaciones en la implementación.

Para verificar que son coplanarios, podemos ver que los puntos se encuentran en el plano z=0 (es decir, sus coordenadas z son todas 0).
Esto garantiza que están en el mismo plano OXY, lo cual satisface la condición de coplanaridad de forma trivial.

curva de bézier coplanaria
% Puntos de control coplanares 

P0 = [0, 0,0]; 

P1 = [1, 2,0]; 

P2 = [3, 3,0]; 

P3 = [4, 0,0]; 

% Parámetro t (de 0 a 1) 

t = linspace(0, 1, 50); 

% Polinomios 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); 

% Representación gráfica 

figure; 

plot(x, y, 'b-', 'LineWidth', 2); hold on; 

plot([P0(1) P1(1) P2(1) P3(1)], [P0(2) P1(2) P2(2) P3(2)], 'ro--'); 

legend('Curva de Bézier', 'Curva poligonal'); 

title('Curva de Bézier Cúbica'); 

xlabel('x'); ylabel('y'); 

grid on;



2 Campo tangente T(t) y campo normal N(t)

El análisis de las propiedades locales de una curva es fundamental en aplicaciones como la dinámica y la simulación. En este apartado, se calcularán y visualizarán el campo tangente T(t) y el campo normal N(t) en varios puntos de la curva de Bézier, mostrando cómo varían a lo largo de la trayectoria.


El campo tangente sirve para ver como un objeto se va a mover siguiendo la dirección de la curva, y determinar la dirección de un punto cuando la curva es una trayectoria.

[math]\mathbf{T}(t)= \frac{dB(t)}{dt}[/math]

También expresada en los componentes [math] \left[ \mathbf{x}, \mathbf{y}\right] [/math]

[math] x'(t) = -3(1-t)^2 x_0 + 3(1-t)^2 x_1 - 6t(1-t) x_1 + 6t(1-t) x_2 - 3t^2 x_2 + 3t^2 x_3 [/math]
[math] y'(t) = -3(1-t)^2 y_0 + 3(1-t)^2 y_1 - 6t(1-t) y_1 + 6t(1-t) y_2 - 3t^2 y_2 + 3t^2 y_3 [/math]

El campo normal servirá para diseñar caminos suaves y evitar cambios bruscos en la trayectoria.

[math]\mathbf{N}(t) = \frac{1}{\|\mathbf{T}(t)\|} \left[ -T_y(t), T_x(t) \right][/math]

siendo [math]T_x(t)[/math] y [math]T_y(t)[/math] los componentes x e y del vector T(t) de forma que se expresan de la forma:

[math]T_x(t) = \frac{d x(t)}{d t}[/math]

[math]T_y(t) = \frac{d y(t)}{d t}[/math]

El gráfico del campo de vectores normal y tangente nos permite visualizar como van variando estos vectores a lo largo de la trayectoria de la curva de bézier



Campos Normal y Tangente
% Puntos de control coplanares  

 P0 = [0, 0,0];  

P1 = [1, 2,0];  

P2 = [3, 3,0];  

P3 = [4, 0,0];  

% Parámetro t (de 0 a 1)  

t = linspace(0, 1, 50);  

% Polinomios 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);  

 % Derivadas de la curva de Bézier  

 dx = gradient(x, t);  

dy = gradient(y, t);  

 % Vectores tangentes normalizados  

 T = [dx; dy] ./ sqrt(dx.^2 + dy.^2);  

 % Vectores normales (perpendiculares al tangente)  

 N = [-T(2, :); T(1, :)];  

 % Representar la curva con campos tangente y normal  

figure;   

plot(x, y, 'b-', 'LineWidth', 2); hold on;  

quiver(x, y, T(1, :), T(2, :), 0.5, 'r'); % Campo tangente  

quiver(x, y, N(1, :), N(2, :), 0.5, 'g'); % Campo normal  

legend('Curva de Bézier', 'Campo Tangente', 'Campo Normal');  

title('Campo Tangente y Normal de la Curva de Bézier');  

xlabel('x'); ylabel('y');  

grid on;



El campo tangente está formado por líneas que siguen la dirección de la curva en cada punto, indicando cómo se orienta y mueve la curva a medida que avanzamos a lo largo de ella. Es esencial para entender la variación de la dirección de la curva y calcular propiedades como la curvatura.


El campo normal es perpendicular al campo tangente en cada punto y se orienta ortogonalmente a la curva. Este campo es clave para analizar la curvatura, ya que describe cómo la curva se "dobla".
Ambos campos, tangente y normal, son fundamentales para comprender la geometría y el comportamiento local de la curva.


3 Curvatura de la Curva de Bézier

La curvatura \( \kappa(t) \) de una curva mide el cambio de dirección del vector tangente por unidad de longitud en función del parámetro 𝑡.

Este concepto describe cómo cambia la dirección de la curva en cada punto.

En este apartado, se calculará y representará gráficamente la curvatura de la curva de Bézier planteada previamente, analizando su geometría local. Esto permitirá identificar puntos clave, como los de máxima y mínima curvatura, y optimizar el diseño de la curva.

El estudio de la curvatura es fundamental en aplicaciones prácticas, especialmente en la ingeniería de caminos. Por ejemplo, en el diseño de carreteras, este análisis ayuda a lograr un equilibrio entre suavidad y eficiencia, reduciendo la curvatura en puntos críticos. De esta manera, se mejora tanto la seguridad como la comodidad del usuario.

La curvatura se calcula a través de la siguiente fórmula:

[math] \kappa(t) = \frac{|x'(t)y''(t)-y'(t)x''(t)|}{(x'(t)^2 + y'(t)^2)^\frac{3}{2}}[/math]

para ello necesitaremos las derivadas primeras de la curva parametrizada (ya calculadas en el apartado anterior) y las segundas derivadas, que si la expresamos por componentes [math] \left[ \mathbf{x}, \mathbf{y}\right] [/math] nos queda:

Para la componente \( x(t) \):

[math] x''(t) = 6(1-t) x_0 - 12t(1-t) x_1 + 6t^2 x_2 - 6t^2 x_3 [/math]

Para la componente \( y(t) \):

[math] y''(t) = 6(1-t) y_0 - 12t(1-t) y_1 + 6t^2 y_2 - 6t^2 y_3 [/math]



Curvatura de la curva de Bézier
% Puntos de control coplanares 

P0 = [0, 0,0]; 

P1 = [1, 2,0]; 

P2 = [3, 3,0]; 

P3 = [4, 0,0]; 

% Parámetro t (de 0 a 1) 

t = linspace(0, 1, 50); 

% Polinomios 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); 

% Derivadas de la curva de Bézier 

dx = gradient(x, t); 

dy = gradient(y, t); 

% Vectores tangentes normalizados 

T = [dx; dy] ./ sqrt(dx.^2 + dy.^2); 

% Vectores normales (perpendiculares al tangente) 

N = [-T(2, :); T(1, :)]; 

% Segunda derivada de la curva 

d2x = gradient(dx, t); 

d2y = gradient(dy, t); 

% Curvatura 

curvatura = abs(dx .* d2y - dy .* d2x) ./ (dx.^2 + dy.^2).^(3/2); 

% Representar curvatura 

figure; 

plot(t, curvatura, 'm-', 'LineWidth', 2); 

title('Curvatura de la Curva de Bézier'); 

xlabel('t'); ylabel('\kappa(t)'); 

grid on;



4 Vector tangente, vector normal y circunferencia osculatriz asociado a la curva de Beizer

La representación dinámica de los vectores tangente, normal y de la circunferencia osculatriz permite entender mejor las propiedades geométricas de una curva. Este apartado incluye la creación de una animación en MATLAB que visualiza estos elementos mientras se recorre la curva de Bézier.


La tangente indica la dirección de la curva en cada punto; el vector normal es perpendicular al tangente y apunta hacia el centro de la curva; la circunferencia osculatriz es el circulo que mejor aproxima la curva en un punto dado.


Una curva [math] \gamma(t) = (x(t),y(t)) [/math] está parametrizada por longitud de arco si [math] x′(t)^2 + y′(t)^2 = 1 [/math] para todo t.


Si la curva no está parametrizada por longitud de arco, [math] \vec t(t) [/math] se calculará de la siguiente manera:


•Vector tangente: [math] \vec t(t)=\frac{1}{\sqrt{x'(t)^2 + y'(t)^2}}(x'(t)\vec i+y'(t)\vec j) [/math]



•Vector normal: [math] \vec n(t)=\frac{1}{\sqrt{x'(t)^2 + y'(t)^2}}(-y'(t)\vec i+x'(t)\vec j)[/math]



Dada una parametrización γ(t) definimos la circunferencia osculatriz en

γ(t) como aquella determinada por:


•Su radio R(t), que es igual a: [math] R(t)=\frac{1}{|\kappa(t)|} [/math]


•Su centro Q(t), que viene dado por la fórmula: [math] Q(t)= \gamma(t)+\frac{1}{|\kappa(t)|} \vec n(t) [/math]


Recordad que una circunferencia de radio R y centro Q = (Qx, Qy) se puede parametrizar

como:


[math] c(t) = (Q_x + R cost, Q_y + R sin t), t ∈ [0, 2π] [/math]


La relación entre la curvatura de una curva κ(t) y el radio de la circunferencia osculatriz R(t) es inversa. Es por eso, que se puede observar que en los puntos con menos curvatura como el (0,0) y el (0,4), que coinciden con los puntos inicial y final, son los puntos que mayor radio en la circunferencia osculatriz tienen.




Animación del vector tangente, normal y de la circunferencia osculatriz

% Puntos de control coplanares  

P0 = [0, 0,0];  

P1 = [1, 2,0];  

P2 = [3, 3,0];  

P3 = [4, 0,0];  

% Parámetro t (de 0 a 1)  

t = linspace(0, 1, 100);  

% Polinomios 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);  

% Derivadas de la curva de Bézier  

dx = gradient(x, t);  

dy = gradient(y, t);  

% Vectores tangentes normalizados  

T = [dx; dy] ./ sqrt(dx.^2 + dy.^2);  

% Vectores normales (perpendiculares al tangente)  

N = [-T(2, :); T(1, :)];  

% Segunda derivada de la curva  

d2x = gradient(dx, t);  

d2y = gradient(dy, t);  

% Curvatura  

curvatura = abs(dx .* d2y - dy .* d2x) ./ (dx.^2 + dy.^2).^(3/2);  

% Radio de curvatura  

R = 1 ./ curvatura;  

% Animación  

figure;  

for i = 1:length(t)  

    clf;  

    plot(x, y, 'b-', 'LineWidth', 2); hold on;  

    quiver(x(i), y(i), T(1, i), T(2, i), 0.5, 'r', 'LineWidth', 1.5); % Tangente  

    quiver(x(i), y(i), N(1, i), N(2, i), 0.5, 'g', 'LineWidth', 1.5); % Normal  

    % Circunferencia osculatriz  

    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, 'm--');  

    title('Animación: Vectores y Circunferencia Osculatriz');  

    xlabel('x'); ylabel('y');  

    axis equal; grid on;  

    pause(0.1);  

end



5 Curva de Bézier tridimensional y curva poligonal

Las curvas de Bézier pueden extenderse al espacio tridimensional para modelar trayectorias más complejas. En este contexto, representaremos una curva de Bézier tridimensional generada a partir de cuatro puntos de control no coplanares, junto con la curva poligonal asociada.


El objetivo sigue siendo el mismo que en dos dimensiones: suavizar la trayectoria de la curva y minimizar los cambios bruscos en su curvatura. Sin embargo, al trabajar en tres dimensiones, las aplicaciones son mucho más amplias, permitiendo modelar superficies y estructuras complejas. Estas curvas se utilizan ampliamente en ingeniería, diseño y gráficos por computadora para crear modelos tridimensionales, como automóviles, piezas industriales y otros objetos con formas detalladas.


La curva se define en términos de sus componentes cartesianos [math] \left[ \mathbf{x}, \mathbf{y}, \mathbf{z} \right] [/math], mediante la fórmula de Bézier cúbica:


[math]B(t) = (1-t)^3P_0 + 3t(1-t)^2P_1 + 3t^2(1-t)P_2 + t^3P_3, \; t \in [0,1] [/math]
A su vez, los puntos de control utilizados son:
[math] P0=(0,0,0), P1=(10,20,5), P2=(20,-10,15), P3=(30,0,0) [/math].



curva de bézier en 3 dimensiones
% Puntos de control en 3D 
P0 = [0, 0, 0]; 
P1 = [10, 20, 5]; 
P2 = [20, -10, 15]; 
P3 = [30, 0, 0]; 
% Parámetro t (de 0 a 1) 
t = linspace(0, 1, 50); 
% Polinomios 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 
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); 
z = B0 * P0(3) + B1 * P1(3) + B2 * P2(3) + B3 * P3(3); 
% Representación gráfica 
figure; 
plot3(x, y, z, 'b-', 'LineWidth', 2); hold on; 
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)], 'ro--'); 
legend('Curva de Bézier', 'Curva Poligonal'); 
title('Curva de Bézier Tridimensional');
xlabel('x'); ylabel('y'); zlabel('z'); 
grid on; axis equal;



Se puede apreciar claramente el propósito de las curvas de Bézier: suavizar la trayectoria al pasar por los puntos de control.

En este caso, la curva resultante muestra cómo se genera una transición suave entre los cuatro puntos dados, minimizando cambios bruscos y creando un recorrido continuo y elegante.

Este efecto es esencial en aplicaciones donde la fluidez y la precisión son clave, como en el diseño de trayectorias, superficies y modelos tridimensionales.

6 Gráficas de curvatura y de torsión

En el espacio tridimensional, las propiedades locales de una curva están determinadas por su Curvatura [math]\kappa(t)[/math] y torsión [math]\tau(t)[/math].
En este apartado, se calcularán ambas magnitudes y se representarán gráficamente como funciones del parámetro t.

[math]\kappa(t) = \frac{\| \mathbf{r}'(t) \times \mathbf{r}''(t) \|}{\| \mathbf{r}'(t) \|^3}[/math]

[math]\tau(t) = \frac{\det\left(\mathbf{r}'(t), \mathbf{r}''(t), \mathbf{r}'''(t)\right)}{\|\mathbf{r}'(t)\|^2 \|\mathbf{r}'(t) \times \mathbf{r}''(t)\|}[/math]


La curvatura mide cuánto cambia la dirección de una curva con respecto a su longitud de arco.

En una gráfica de 𝜅(𝑡)frente a 𝑡, los picos altos representan zonas donde la curva se dobla mucho, como en los giros o bucles.

Los valores bajos o cercanos a cero indican segmentos rectos o casi rectos.

A su vez, la torsión mide cuánto una curva "sale del plano", es decir, cuánto cambia el plano osculador de la curva a lo largo de su longitud.

Los picos altos representan zonas donde la curva tiene giros tridimensionales pronunciados.

Los valores bajos o iguales a cero indican segmentos donde la curva es más plana o no presenta torsión.

Curvatura y Torsión de la curva
% Puntos de control en 3D 
P0 = [0, 0, 0]; 
P1 = [10, 20, 5]; 
P2 = [20, -10, 15]; 
P3 = [30, 0, 0]; 
% Parámetro t (de 0 a 1) 
t = linspace(0, 1, 50); 
% Polinomios 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 
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); 
z = B0 * P0(3) + B1 * P1(3) + B2 * P2(3) + B3 * P3(3); 
% Derivadas de la curva tridimensional 
dx = gradient(x, t); dy = gradient(y, t); dz = gradient(z, t); 
d2x = gradient(dx, t); d2y = gradient(dy, t); d2z = gradient(dz, t); 
d3x = gradient(d2x, t); d3y = gradient(d2y, t); d3z = gradient(d2z, t); 
% Curvatura (en 3D) 
curvatura = sqrt((dy .* d2z - dz .* d2y).^2 + (dz .* d2x - dx .* d2z).^2 + (dx .* d2y - dy .* d2x).^2) ./ ... 
            (sqrt(dx.^2 + dy.^2 + dz.^2).^3); 
% Torsión 
numerador = (dx .* (d2y .* d3z - d2z .* d3y) - dy .* (d2x .* d3z - d2z .* d3x) + dz .* (d2x .* d3y - d2y .* d3x)); 
denominador = (dx.^2 + dy.^2 + dz.^2) .* curvatura.^2; 
torsion = numerador ./ denominador; 
% Representación gráfica 
figure; 
subplot(2, 1, 1); 
plot(t, curvatura, 'b-', 'LineWidth', 2); 
title('Curvatura de la Curva Bézier'); 
xlabel('t'); ylabel('\kappa(t)'); 
grid on; 
subplot(2, 1, 2); 
plot(t, torsion, 'r-', 'LineWidth', 2); 
title('Torsión de la Curva Bézier'); 
xlabel('t'); ylabel('\tau(t)'); 
grid on;


7 Triedo de Frenet a lo largo de la curva

El triedro de Frenet, formado por los vectores tangente, normal y binormal, describe completamente la geometría local de una curva en 3D. En este apartado, se creará una animación que muestra cómo evoluciona este triedro a lo largo de la curva.


La curva de Bézier se forma mediante la utilización de puntos de control y polinomios de Bernstein que se encargan de conectar suavemente esos puntos para establecer una ruta específica. Del mismo modo que surge esta curva característica también se define el triedro de Bézier en los siguientes términos:


1) La tangente (𝑇) indica la orientación de la curva en cualquier punto dado y se determinada mediante la derivada de la posición respecto al parámetro que define la curva y luego normalizada para obtener un vector unitario.


2) La normal (N) indica la variación en la dirección de la tangente a lo largo de la curva al calcular y normalizar el vector derivado de la tangente para describir los cambios locales en la curva.


3) La binormal (Bi) es el vector que es perpendicular tanto al vector tangente como al normal de la curva en un punto dado, y se obtiene mediante el producto cruz de estos dos vectores para formar parte del sistema de referencia ortonormal asociado.



Triedro de frenet a lo largo de la curva

% Puntos de control en 3D 
P0 = [0, 0, 0]; 
P1 = [10, 20, 5]; 
P2 = [20, -10, 15]; 
P3 = [30, 0, 0]; 
% Parámetro t 
t = linspace(0, 1, 100); 
% Polinomios 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 
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); 
z = B0 * P0(3) + B1 * P1(3) + B2 * P2(3) + B3 * P3(3); 
% Derivadas de la curva 
dx = gradient(x, t);     % Primera derivada 
dy = gradient(y, t); 
dz = gradient(z, t); 
d2x = gradient(dx, t);   % Segunda derivada 
d2y = gradient(dy, t); 
d2z = gradient(dz, t); 
% Tangente (T) 
T = [dx; dy; dz]; 
T = T ./ vecnorm(T);     % Normalización 
% Normal (N) 
dT = gradient(T, t, 2);  % Derivada del vector tangente 
N = dT ./ vecnorm(dT);   % Normalización 
% Binormal (B) 
B = cross(T, N);         % Producto cruz entre T y N 
% Animación del triedro de Frenet 
figure; 
for i = 1:length(t) 
    clf;                 % Limpia la figura en cada iteración 
    % Curva de Bézier 
    plot3(x, y, z, 'b-', 'LineWidth', 2); hold on; 
    % Triedro de Frenet 
    quiver3(x(i), y(i), z(i), T(1, i), T(2, i), T(3, i), 5, 'r', 'LineWidth', 1.5); % Tangente 
    quiver3(x(i), y(i), z(i), N(1, i), N(2, i), N(3, i), 5, 'g', 'LineWidth', 1.5); % Normal 
    quiver3(x(i), y(i), z(i), B(1, i), B(2, i), B(3, i), 5, 'k', 'LineWidth', 1.5); % Binormal 
    % Estilizado del gráfico 
    title('Triedro de Frenet'); 
    xlabel('x'); ylabel('y'); zlabel('z'); 
    legend('Curva Bézier', 'Tangente (T)', 'Normal (N)', 'Binormal (B)'); 
    grid on; axis equal; 
    view(3); % Vista 3D 
    pause(0.1); 
end


8 Velocidad que debe mantener el Ferrari

Comenzando con el cálculo, necesitamos primero establecer un equilibrio de fuerzas para que el Ferrari no se salga de la pista:

La condición es que la fuerza centrípeta que mantiene al Ferrari en la curva debe estar equilibrada por la fuerza de fricción que impide que el coche se deslice fuera de la pista.


- Fuerza centrípeta:

La fuerza centrípeta es la que mantiene a un objeto en movimiento circular. Para un coche en la curva, esta fuerza es directamente proporcional a la masa m, la curvatura κ de la curva y al cuadrado de la velocidad v₀²:


[math] F_c = m \kappa v_0^2 [/math]

- m es la masa del coche.

- κ es la curvatura de la curva de Bézier.

- v₀ es la velocidad constante del coche a lo largo de la curva.




- Fuerza de fricción:

La fuerza de fricción es la que se opone al movimiento del coche y depende del coeficiente de fricción μ entre los neumáticos y la pista, así como de la masa del coche y la gravedad g:


[math] F_{\text{fricción}} = \mu m g [/math]


- μ = 1.5 es el coeficiente de fricción entre los neumáticos y la pista.

- m es la masa del coche.

- g = 9.81 m/s² es la aceleración debida a la gravedad.




- Condición para evitar que el coche se deslice:

Para que el coche no se salga de la pista, la fuerza centrípeta debe ser menor o igual a la fuerza de fricción, es decir:


[math] F_c \leq F_{\text{fricción}} [/math]


Sustituyendo las ecuaciones de Fcentrípeta y Ffricción:


[math] m \kappa v_0^2 \leq \mu m g [/math]


La masa m aparece en ambos lados de la ecuación, por lo que se cancela:


[math] \kappa v_0^2 \leq \mu g [/math]

Despejando \( v_0 \), tendríamos la condición final necesaria para proseguir con el ejercicio:


[math] v_0 \leq \sqrt{\frac{\mu g}{\kappa}} [/math]

Para calcular la velocidad máxima \( v_0 \) que el Ferrari puede mantener sin salirse de la pista, es necesario utilizar la curvatura máxima \( \kappa_{\text{max}} \) de la curva. La curvatura \( \kappa \) describe cuán pronunciada es la curva en cada punto del circuito. Sin embargo, la curvatura máxima representa el valor más alto de la curvatura a lo largo de toda la trayectoria, es decir, el punto donde la curva es más cerrada.


Este valor es crítico porque, en los puntos con mayor curvatura, el coche experimenta una mayor fuerza centrípeta. Si la velocidad es demasiado alta en estos puntos, la fuerza centrípeta podría superar la fuerza de fricción, lo que haría que el coche se deslice fuera de la pista. Por lo tanto, para asegurar que el coche no pierda adherencia en ningún momento del recorrido, se utiliza la curvatura máxima para calcular la velocidad máxima.

Una vez despejado el valor de la velocidad, procedemos a calcular el valor de la curvatura en función del parámetro \( t \in [0,1] \). Una vez calculada, procedemos a maximizar la función de la curvatura en función de \( t \):


Para ello, primero tenemos que parametrizar la curva \( \mathbf{r}(t) \) de Bézier a partir de los puntos \( P_0 \), \( P_1 \), \( P_2 \) y \( P_3 \).


Los puntos de control son:

[math] P_0 = [0, 0, 0], \quad P_1 = [30, 50, 5], \quad P_2 = [60, -30, -10], \quad P_3 = [100, 0, 0]. [/math]


La parametrización de la curva de Bézier está dada por:

[math] \mathbf{r}(t) = (1-t)^3 P_0 + 3(1-t)^2 t P_1 + 3(1-t) t^2 P_2 + t^3 P_3, \quad t \in [0,1]. [/math]

La curva de Bézier parametrizada en función de \( t \) con sus componentes simplificadas es:


[math] x(t) = 90t - 90t^2 + 30t^3, [/math]


[math] y(t) = 150t - 240t^2 + 90t^3, [/math]


[math] z(t) = 15t - 30t^2 + 15t^3. [/math]

Para calcular la curvatura de la curva \( r(t) \), necesitamos conocer cómo cambia su dirección y su velocidad. Esto se logra a través de la primera derivada \( r'(t) \), que representa la velocidad a lo largo de la curva, y la segunda derivada \( r(t) \), que describe cómo varía esa velocidad. La curvatura nos permite medir qué tan "cerrada" es la curva en cada punto, un dato crucial para determinar la velocidad máxima segura que puede mantener el Ferrari sin salirse de la pista.


La fórmula utilizada para calcular la curvatura es:


[math] \kappa(t) = \frac{\|r'(t) \times r''(t)\|}{\|r'(t)\|^3} [/math]

por lo que debemos obtener el valor de las derivadas y segundas de la curva:

- Derivadas de la curva \( r(t) \):


[math] x'(t) = 90 - 180t + 90t^2 [/math]


[math] y'(t) = 150 - 780t + 630t^2 [/math]


[math] z'(t) = 15 - 60t + 45t^2 [/math]


- Segundas derivadas de la curva \( r(t) \):


[math] x''(t) = -180 + 180t [/math]


[math] y''(t) = -780 + 1260t [/math]


[math] z''(t) = -60 + 90t [/math]

Con todos los datos necesarios ya calculados, procedemos a determinar la curvatura, lo que nos permitirá maximizarla en el siguiente paso.

El valor de la curvatura en función de t es la siguiente:

[math] \kappa(t) = \frac{4 \sqrt{1133t^4 + 6294t^3 + 15215t^2 - 21822t + 6277}}{15(2389t^4 - 5136t^3 + 3770t^2 - 1056t + 137)^{3/2}} [/math]

Por lo que la curvatura máxima de la curva de bézier es de:

[math] \kappa_{\text{máx}} = 0.054891354 [/math]


Y por lo tanto la velocidad que necesitábamos calcular para que el Ferrari puede mantener sin salirse de la pista es:


[math] v_0 = 16.37 \, \text{m/s} [/math]

9 Vector velocidad y vector aceleración centrípeta

En este apartado queremos mostrar la utilidad del vector velocidad y del vector aceleración centrípeta. Para ello, hemos generado una curva de Bezier en 3 dimensiones y la analizamos, añadiendo una animación para visualizar su movimiento.


Vector velocidad: Representa la tasa de cambio de posición con respecto al tiempo. Se obtiene derivando el vector posición y nos da una idea de lo rápido que recorre un punto la curva. En el código derivamos precisamente frente al parámetro t


Velocidad máxima constante: Garantiza que la fuerza centrípeta no exceda la fuerza de fricción


[math] v_0 = \sqrt(\mu g/max(\kappa)) [/math]


Vector aceleración centrípeta: Es la componente de la aceleración perpendicular al vector velocidad. Surge debdo al cambio de dirección y depende de variables como la curvatura(κ) y el vector normal unitario (n).



[math] a_c=v^2 . (\kappa) . n [/math]


Con este código podemos ver una trayectoria suave y continua gracias a las curvas de Bezier, y en ella representar tanto la trayectoria como ambos vectores de velocidad y aceleración centrípeta.

right

% Puntos de control de la curva Bézier 

P0 = [0, 0, 0]; 

P1 = [30, 50, 5]; 

P2 = [60, -30, -10]; 

P3 = [100, 0, 0]; 

 

% Constantes 

g = 9.81; % m/s^2 

mu = 1.5; % coeficiente de fricción 

n_points = 500; % puntos para discretizar la curva 

 

% Generar valores de t 

t_vals = linspace(0, 1, n_points); 

 

% Función de la curva Bézier cúbica 

bezier_curve = @(t) (1-t).^3 .* P0 + 3*(1-t).^2.*t .* P1 + 3*(1-t).*t.^2 .* P2 + t.^3 .* P3; 

 

% Derivadas de la curva 

bezier_velocity = @(t) -3*(1-t).^2 .* P0 + (3*(1-t).^2 - 6*(1-t).*t) .* P1 + ... 

                        (6*(1-t).*t - 3*t.^2) .* P2 + 3*t.^2 .* P3; 

 

bezier_acceleration = @(t) 6*(1-t) .* (P2 - 2*P1 + P0) + 6*t .* (P3 - 2*P2 + P1); 

 

% Evaluar posiciones, velocidades y aceleraciones 

positions = zeros(n_points, 3); 

velocities = zeros(n_points, 3); 

accelerations = zeros(n_points, 3); 

curvature = zeros(1, n_points); 

 

for i = 1:n_points 

    t = t_vals(i); 

    positions(i, :) = bezier_curve(t); 

    velocities(i, :) = bezier_velocity(t); 

    accelerations(i, :) = bezier_acceleration(t); 

    % Curvatura en cada punto 

    v = velocities(i, :); 

    a = accelerations(i, :); 

    curvature(i) = norm(cross(v, a)) / (norm(v)^3); 

end 

 

% Velocidad máxima constante 

v0 = sqrt(mu * g / max(curvature)); 

fprintf('La velocidad máxima constante v0 es: %.2f m/s\n', v0); 

 

% Escalar aceleración centrípeta para usarla en la animación 

centripetal_accelerations = v0^2 * curvature; 

 

% Crear figura para la animación 

figure; 

plot3(positions(:, 1), positions(:, 2), positions(:, 3), 'b', 'LineWidth', 1.5); 

hold on; 

 

% Configuración de la gráfica 

xlabel('X (m)'); 

ylabel('Y (m)'); 

zlabel('Z (m)'); 

title('Animación: Velocidad y Aceleración Centrípeta'); 

grid on; 

view(3); 

 

% Inicializar flechas de velocidad y aceleración centrípeta 

vel_arrow = quiver3(0, 0, 0, 0, 0, 0, 'r', 'LineWidth', 1.2, 'MaxHeadSize', 1); 

acc_arrow = quiver3(0, 0, 0, 0, 0, 0, 'g', 'LineWidth', 1.2, 'MaxHeadSize', 1); 

 

% Crear leyenda correcta 

legend('Trayectoria', 'Velocidad', 'Aceleración centrípeta', 'Location', 'Best'); 

 

% Animación 

for i = 1:n_points 

    % Posición actual 

    pos = positions(i, :); 

    vel = velocities(i, :) / norm(velocities(i, :)) * v0; % Normalizar la velocidad 

    acc =  accelerations(i, :)  / norm(accelerations(i, :))  * centripetal_accelerations(i); % Normalizar la aceleración 

 

    % Actualizar flechas 

    set(vel_arrow, 'XData', pos(1), 'YData', pos(2), 'ZData', pos(3), ... 

        'UData', vel(1), 'VData', vel(2), 'WData', vel(3)); 

 

    set(acc_arrow, 'XData', pos(1), 'YData', pos(2), 'ZData', pos(3), ... 

        'UData', acc(1), 'VData', acc(2), 'WData', acc(3)); 

 

    % Pausar para animación 

    pause(0.02); 

end



10 Aplicaciones de las curvas de Bézier en la ingeniería

Las curvas de Bézier tienen aplicaciones significativas en diversas áreas de la ingeniería debido a su versatilidad y precisión para modelar trayectorias, superficies y diseños complejos. Algunos aspectos importantes en los que se usan estas curvas son los siguientes:


1. Planificación de trayectorias: En sistemas automatizados, las curvas de Bézier se utilizan para planificar trayectorias suaves y precisas para robots móviles. Estas curvas permiten que los robots eviten obstáculos y se desplacen de forma eficiente en entornos dinámicos. Por ejemplo, se han implementado en robots autosuficientes para diseñar trayectorias tridimensionales optimizadas, facilitando tareas como la interceptación de objetos móviles o la navegación en espacios restringidos.


2.Procesos de manufactura: En procesos de manufactura, como el corte óptico o fresado, las curvas de Bézier son fundamentales para programar movimientos precisos de herramientas. Estas curvas aseguran acabados suaves en piezas complejas, reduciendo errores y tiempos de producción. En la industria automotriz, se emplearon inicialmente para diseñar carrocerías, como en Citroën, demostrando su utilidad en la creación de formas aerodinámicas y estéticamente agradables.


3.Diseño de superficies complejas: En diseño aeronáutico y naval, estas curvas ayudan a modelar superficies complejas como fuselajes y cascos de barcos. Su capacidad para interpolar puntos de control permite optimizar diseños que deben cumplir con rigurosos estándares aerodinámicos o hidrodinámicos. Por ejemplo, herramientas de diseño asistido por computadora (CAD) utilizan curvas y superficies de Bézier para ajustar modelos tridimensionales de alta precisión.


En general, las curvas de Bézier son esenciales en cualquier aplicación que requiera modelar formas suaves y controladas, desde gráficos computacionales hasta la ingeniería civil y la animación digital.