2011-08-05 3 views
1

J'essaie de calculer une ligne qui peut tenir compte de plusieurs points avec une coordonnée 2D dans MATLAB. Mais le résultat n'est pas attendu. Il y a peut-être quelque chose que je comprends mal. Quelqu'un peut m'aider? Merci beaucoup. Le code est le suivant:Ajustement d'une ligne à 2 points dans MATLAB

ptsAroundVCP_L=[180,188;177,191;174,191;171,191;168,188;] % points with 2-d coordinate 
curLinePar_L=polyfit(ptsAroundVCP_L(:,2),ptsAroundVCP_L(:,1),1); % parameter of the fitted line 

%% begin to plot 
plotx=1:256;  
figure(11);hold on; 
plot(ptsAroundVCP_L(:,2),ptsAroundVCP_L(:,1),'sb');  
ploty_L=polyval(curLinePar_L,plotx); 
plot(plotx,ploty_L,'r'); 
hold off; 

La sortie est représentée comme suit. Mais ce à quoi je m'attendais, c'est que la ligne ajustée devrait aller verticalement dans ce cas. Je pense qu'il y a quelque chose qui ne va pas avec le raccord de ligne. enter image description here

Répondre

4

Il est impossible d'adapter à tout polynôme raisonnable à ces données comme indiqué:

X  Y 
    188 180 
    191 177 
    191 174 
    191 171 
    188 168 

Prenez la transposition et vous obtenir quelque chose raisonnable:

ptsAroundVCP_L=[180,188;177,191;174,191;171,191;168,188;] 

y = ptsAroundVCP_L(:,2); 
x = ptsAroundVCP_L(:,1); 

p = polyfit(x, y, 2); 

plotx= linspace(150, 200, 101); 

figure(11); 

plot(x, y, 'sb');  
hold on 

ploty = polyval(p, plotx); 
plot(plotx, ploty, '-'); 
hold off; 

enter image description here

3

Je pense que le problème est fondamentalement que vous ne pouvez pas représenter une ligne verticale sous forme d'interception de pente. Si vous retournez x/y dans votre forme, vous obtenez le bon résultat:

ptsAroundVCP_L=[180,188;177,191;174,191;171,191;168,188;] % points with 2-d coordinate 
curLinePar_L=polyfit(ptsAroundVCP_L(:,1),ptsAroundVCP_L(:,2),1); % parameter of the fitted line 

%% begin to plot 
plotx=168:180; 
figure(11);hold on; 
plot(ptsAroundVCP_L(:,1),ptsAroundVCP_L(:,2),'sb'); 
ploty_L=polyval(curLinePar_L,plotx); 
plot(plotx,ploty_L,'r'); 
hold off; 
Questions connexes