Diferencia entre revisiones de «Curvas de Bézier Grupo 2»

De MateWiki
Saltar a: navegación, buscar
(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.)
Línea 219: Línea 219:
 
==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.==
  
 
+
[[Archivo:Animacion4|miniaturadeimagen|Animación del vector tangente, normal y la circunferencia osculatriz]]
 
{{matlab|codigo=
 
{{matlab|codigo=
 
% Puntos de control coplanares  
 
% Puntos de control coplanares  

Revisión del 20:52 4 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:

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

donde \(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.


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 seleccionamos 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]


Definimos la fórmula de la curva cúbica en Matlab usando los polinomios de Bernstein y los coeficientes binomiales. 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 nos permite adaptarla a distintas aplicaciones.

CURVA DE BÉZIER CÚBICA
% Selección de puntos de control coplanarios
P0 = [0, 0, 0];    
P1 = [4, 2, 0];
P2 = [0, 2, 0];
P3 = [4, 4, 0];
n = 3; % Orden de la curva de Bézier

% 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))^n;
    B1 = n * (1-t(i))^2 * t(i);
    B2 = n * (1-t(i)) * t(i)^2;
    B3 = t(i)^n;
    
    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.

  • 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]:

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

donde la derivada del polinomio de Bernstein es:

[math] B'_{i,3}(t) = \binom{3}{i} [it^{i-1} (1-t)^{3-i} - (3-i)t^i (1-t)^{2-i}]\ [/math]

El vector tangente se obtiene normalizando la derivada:

[math]T(t)=\frac{B'(t)}{||B'(t)||} [/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).

La fórmula general para una rotación alrededor de un eje [math]e[/math] unitario con un ángulo [math]θ[/math] es:

[math] R(e,θ)=cos(θ)·I+(1-cos(θ))(e⊗e)+sin(θ)·[e[/math]x[math]][/math]

Particularizando para [math] e_z=\begin{pmatrix} 0 \\ 0 \\ 1 \end{pmatrix} [/math]:

[math] R(e_z,90º)=0·I+(1-0)· \begin{pmatrix} 0 & 0 & 0\\ 0 & 0 & 0\\ 0 & 0 & 1 \end{pmatrix} + 1· \begin{pmatrix} 0 & -1 & 0\\ 1 & 0 & 0\\ 0 & 0 & 0 \end{pmatrix}=\begin{pmatrix} 0 & -1 & 0\\ 1 & 0 & 0\\ 0 & 0 & 1 \end{pmatrix} [/math]

Para rotaciones en el plano XY, es decir, 2D:

[math] R(e_z,90º)=\begin{pmatrix} 0 & -1 \\ 1 & 0 \end{pmatrix} [/math]
CURVA DE BÉZIER CON CAMPOS TANGENTE Y NORMAL
% 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 de una curva describe cuánto y cómo cambia la dirección de la tangente de la curva en cada punto. Esta propiedad se puede expresar como una función del parámetro "t", que generalmente parametriza la curva. En este apartado representaremos el gráfico de la curvatura de la curva en función del parámetro "t".

Definimos la curva [math] B(t) = (x(t), y(t)) [/math]. Para calcular la curvatura de una curva se utiliza la siguiente ecuación:
[math] \kappa(t) = \frac{|x'(t)y''(t)-y'(t)x''(t)|}{((x'(t))^2 + (y'(t))^2)^\frac{3}{2}}[/math]

Curvatura de la curva en función del parámetro t
% Selección de puntos de control coplanarios
P0 = [0, 0, 0];    
P1 = [4, 2, 0];
P2 = [0, 2, 0];
P3 = [4, 4, 0];
n = 3; % Orden de la curva de Bézier

% 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))^n;
    B1 = n * (1-t(i))^2 * t(i);
    B2 = n * (1-t(i)) * t(i)^2;
    B3 = t(i)^n;
    
    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.

Archivo:Animacion4
Animación del vector tangente, normal y la circunferencia osculatriz
% Puntos de control coplanares 
P0 = [0, 0,0]; 
P1 = [4, 2,0]; 
P2 = [0, 2,0]; 
P3 = [4, 4,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 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.