Utilizamos cookies propias y de terceros para mejorar la experiencia de navegación, y ofrecer contenidos y publicidad de interés.
Al continuar con la navegación entendemos que se acepta nuestra política de cookies.
Iniciar sesión Cerrar
Correo:
Contraseña:
Entrar
Recordar sesión en este navegador
Iniciar sesiónIniciar sesiónCrear cuentaCrear cuenta

Matlab - Ayuda con un problema en Bezier compuesta

  Imprimir  
Vista:

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
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de JOSE JEREMIAS CABALLERO

Ayuda con un problema en Bezier compuesta

Publicado por JOSE JEREMIAS CABALLERO jjcc94@hotmail.com (2612 intervenciones) el 02/03/2012 16:00:25
Hola Sergio.
Te filtrado algunos puntos, porque hay partes que no entiendo la logica.
como este parte.
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
en esta parte, me parece no esta tan bien, seria cuestion que lo revises.



Aqui el codigo filtrado.
% BEZIER COMPUESTA % ------------------------------ function curva_beizer clc numpuntos=input('Introduzca el numero de puntos: '); opcion=input('Introduce 1 para ratón o 2 para teclado: '); n=numpuntos-1; if opcion==1 close all figure axis([0,100 0,100]); [px(1),py(1)]=ginput(1); plot(px(1),py(1),'*r'); axis([0,100 0,100]); hold on for k=2:numpuntos [px(k),py(k)]=ginput(1); plot([px(k-1) px(k)],[py(k-1) py(k)],'*r'); plot([px(k-1) px(k)],[py(k-1) py(k)],'-b'); end hold off end if opcion==2 P=input('Introduzca las coordenadas de los puntos entre los corchetes [x1 y1; x2 y2; x3 y3;...; xn yn]: '); px=P(:,1); py=P(:,2); 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 ppx=px; ppy=py; m=1; nm=numpuntos+1; for g=4:4:numpuntos ppx(g)=x(m); ppy(g)=y(m); for t=g+1:nm ppx(t)= px(t-1); ppy(t)= py(t-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)); % % FACTORIAL % ---------------- function f=factorial(n) if n==0 || n==1; f = 1; else f = n*factorial(n-1); end


Saludos.
JOSE JEREMIAS CABALLERO

Servicios de programacion matlab


Asesor de Proyectos con Matlab
programador en matlab
jjcc94@hotmail.com
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Ayuda con un problema en Bezier compuesta

Publicado por Sergio (6 intervenciones) el 19/03/2012 20:28:51
Perdon por no contestar aquí, soy el mismo que usa el seudonimo de Igres.

Te contesto a las preguntas que me has hecho aquí:
http://www.lawebdelprogramador.com/foros/Matlab/1319141-Bucle_de_un_vector.html

1) La longitud puede variar segun los puntos que introduzcas
2) Lo explico aquí, más abajo

En el otro post he puesto lo de querer hacer lo de coger cada x elementos del vector porque la curva se tiene que representar así:
N=2
http://imageshack.us/photo/my-images/825/33758612.png/
N=3
http://imageshack.us/photo/my-images/842/86745842.png/

Con lo de bezier2(), he querido aislar esta función parar poder llamarla cuando cojo los trozos de los vectores:
function = bezier2 (ppx,ppy) 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)

dejándolo así (un poco chapuza creo):
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),'*r'); 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 ppx=px; ppy=py; m=1; nm= numpuntos+1; for g=4:4:numpuntos ppx(g)= x(m); ppy(g)= y(m); for t=g+1:1:nm ppx(t)= px(t-1); ppy(t)= py(t-1); end m=m+1; end nn=length(ppx); ppxx=[]; ppyy=[]; for i=1:fix(nn/3) ppxx=[ppxx ppx(i)]; ppyy=[ppyy ppy(i)]; end bezier2(ppxx,ppyy); for j=fix(n/3+1):fix(2*nn/3-1) ppxx=[ppxx ppx(j)]; ppyy=[ppyy ppy(j)]; end bezier2(ppxx,ppyy) for k=fix(2*nn/3-1):fix(2*nn/3+1) ppxx=[ppxx ppx(k)]; ppyy=[ppyy ppy(k)]; end bezier2(ppxx,ppyy) for l=fix(2*nn/3+1):nn ppxx=[ppxx ppx(l)]; ppyy=[ppyy ppy(l)]; end bezier2(ppxx,ppyy)


Saludos =)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar