Ayuda con un problema en Bezier compuesta
Publicado por Sergio (6 intervenciones) el 02/03/2012 14:47:39
Tengo que hacer la bezier compuesta para un trabajo. La cuestión es que no me sale bien. Si meto 8 puntos ni me sale y cuando pongo 7 puntos me sale la curva hasta el 6 punto, he mirado el código y ya no se donde falla...
Aquí tenéis el algoritmo (el de la bezier):
http://imageshack.us/photo/my-images/193/imagenmj.png/
el de la bezier compuesta es el mismo solo que cada cuatro puntos hay que restarle al cuarto el 3º y dividirlos por 2. Y meter lo que de, en el array de los puntos inicales (en la 4rta posición claro) seguido de como estaba el array, así cada cuatro puntos.
Os copio mi código, ojalá me podáis echar un cable...
BEZIER COMPUESTA
------------------------------
clear all
clc
numpuntos=input('Introduzca el numero de puntos: ');
opcion=input('Introduce 1 para ratón o 2 para teclado: ');
n=numpuntos-1;
figure;
hold on;
axis([0,100 0,100]);
if opcion==1
for k=1:numpuntos
[px(k),py(k)]=ginput(1);
plot(px(k),py(k),'*');
end
plot(px,py);
%[px,py]=ginput(numpuntos);
end
if opcion==2
[px,py]=input('Introduzca las coordenadas de los puntos entre los paréntesis [x1 y1; x2 y2; x3 y3;...; xn yn]: ');
end
b=1;
for l=4:4:numpuntos
x(b)=(px(l) - px(l-1))/2;
y(b)=(py(l) - py(l-1))/2;
b=b+1;
end
for w=1:1:numpuntos
ppx(w) = px(w);
ppy(w) = py(w);
end
m=1;
nm= numpuntos+1
for g=4:4:numpuntos
ppx(g)= x(m);
ppy(g)= y(m);
for y=g+1:1:nm
ppx(y)= px(y-1);
ppy(y)= py(y-1);
end
m=m+1;
end
j=1;
for t=0:0.1:1
concax(j)=0;
concay(j)=0;
for i=0:n
concax(j) = concax(j) + ppx(i+1)*(bernstein(n,i)*(t^(i))*((1-t)^(n-i)));
concay(j) = concay(j) + ppy(i+1)*(bernstein(n,i)*(t^(i))*((1-t)^(n-i)));
end
j=j+1;
end
plot(concax,concay);
BERNSTEIN
-----------------
function [bernstein2] = bernstein(n,i)
bernstein2 = nsobrei(n,i);
NSOBREI
--------------
function [ni] = nsobrei(n,i)
ni=factorial(n)/(factorial(i)*factorial(n-i));
end
FACTORIAL
----------------
function [f] = factorial(n)
if n == 0 || n == 1;
f = 1;
else
f = n*factorial(n-1);
end
Saludos
Aquí tenéis el algoritmo (el de la bezier):
http://imageshack.us/photo/my-images/193/imagenmj.png/
el de la bezier compuesta es el mismo solo que cada cuatro puntos hay que restarle al cuarto el 3º y dividirlos por 2. Y meter lo que de, en el array de los puntos inicales (en la 4rta posición claro) seguido de como estaba el array, así cada cuatro puntos.
Os copio mi código, ojalá me podáis echar un cable...
BEZIER COMPUESTA
------------------------------
clear all
clc
numpuntos=input('Introduzca el numero de puntos: ');
opcion=input('Introduce 1 para ratón o 2 para teclado: ');
n=numpuntos-1;
figure;
hold on;
axis([0,100 0,100]);
if opcion==1
for k=1:numpuntos
[px(k),py(k)]=ginput(1);
plot(px(k),py(k),'*');
end
plot(px,py);
%[px,py]=ginput(numpuntos);
end
if opcion==2
[px,py]=input('Introduzca las coordenadas de los puntos entre los paréntesis [x1 y1; x2 y2; x3 y3;...; xn yn]: ');
end
b=1;
for l=4:4:numpuntos
x(b)=(px(l) - px(l-1))/2;
y(b)=(py(l) - py(l-1))/2;
b=b+1;
end
for w=1:1:numpuntos
ppx(w) = px(w);
ppy(w) = py(w);
end
m=1;
nm= numpuntos+1
for g=4:4:numpuntos
ppx(g)= x(m);
ppy(g)= y(m);
for y=g+1:1:nm
ppx(y)= px(y-1);
ppy(y)= py(y-1);
end
m=m+1;
end
j=1;
for t=0:0.1:1
concax(j)=0;
concay(j)=0;
for i=0:n
concax(j) = concax(j) + ppx(i+1)*(bernstein(n,i)*(t^(i))*((1-t)^(n-i)));
concay(j) = concay(j) + ppy(i+1)*(bernstein(n,i)*(t^(i))*((1-t)^(n-i)));
end
j=j+1;
end
plot(concax,concay);
BERNSTEIN
-----------------
function [bernstein2] = bernstein(n,i)
bernstein2 = nsobrei(n,i);
NSOBREI
--------------
function [ni] = nsobrei(n,i)
ni=factorial(n)/(factorial(i)*factorial(n-i));
end
FACTORIAL
----------------
function [f] = factorial(n)
if n == 0 || n == 1;
f = 1;
else
f = n*factorial(n-1);
end
Saludos
Valora esta pregunta


0