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

Vista:
Me gusta: Está pregunta es útil y esta clara
0
No me gusta: Está pregunta no esta clara o no es útil
 
Asunto:

Ayuda con un problema en Bezier compuesta

Autor:Sergio (6 intervenciones)
Fecha: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
Responder
información
Otras secciones de LWP con contenido similar...
Ampliar imágen de perfil de JOSE JEREMIAS CABALLERO
Me gusta: Está respuesta es útil y esta clara
0
No me gusta: Está respuesta no esta clara o no es útil
 
Asunto:

Ayuda con un problema en Bezier compuesta

Autor:JOSE JEREMIAS CABALLERO jjcc94@hotmail.com (2480 intervenciones)
Fecha: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
Comentar
Me gusta: Está respuesta es útil y esta clara
0
No me gusta: Está respuesta no esta clara o no es útil
 
Asunto:

Ayuda con un problema en Bezier compuesta

Autor:Sergio (6 intervenciones)
Fecha: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 =)
Comentar