Matlab - Ayuda con un problema en Bezier compuesta

 
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
Val: 6.975
Oro
Ha mantenido su posición en Matlab (en relación al último mes)
Gráfica de Matlab

Ayuda con un problema en Bezier compuesta

Publicado por JOSE JEREMIAS CABALLERO (5917 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.
1
2
3
4
5
6
7
8
9
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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
% 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
[email protected]
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:
1
2
3
4
5
6
7
8
9
10
11
12
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):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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