Diferencia entre revisiones de «Curvas de Bezier Grupo 17»

De MateWiki
Saltar a: navegación, buscar
(Triedo de Frenet a lo largo de la curva)
(Triedo de Frenet a lo largo de la curva)
Línea 342: Línea 342:
  
 
==Triedo de Frenet a lo largo de la curva==
 
==Triedo de Frenet a lo largo de la curva==
 
+
{{matlab|codigo=
 
% Puntos de control en 3D
 
% Puntos de control en 3D
 
P0 = [0, 0, 0];
 
P0 = [0, 0, 0];
Línea 404: Línea 404:
 
     pause(0.1);
 
     pause(0.1);
 
end
 
end
 +
}}
  
 
==Velocidad que debe mantener el Ferrari==
 
==Velocidad que debe mantener el Ferrari==
 
==Vector velocidad y vector aceleración centrípeta==
 
==Vector velocidad y vector aceleración centrípeta==
 
==Aplicaciones de las curvas de Bézier en la ingeniería==
 
==Aplicaciones de las curvas de Bézier en la ingeniería==

Revisión del 11:19 4 dic 2024

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
Álvaro Román Aguilera
Fernando Barbancho Lara
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.

•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.

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

% 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

9 Vector velocidad y vector aceleración centrípeta

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