2017-09-25 14 views
-1

ginputを使用してポリゴンの長さと面積を計算するスクリプトを作成しようとしています。だから私がどれだけ多くのポイントを選んでも、そのエリアと長さを表示する必要があります。私は面積を計算する関数と長さを計算する関数の2つの関数を作成しました。ポリゴンの長さと面積を計算する

長さ:

function L=polylen(x,y) 
    n=length(x); 
    L=0; 
for i=1:n-1 
    L=L+sqrt((x(i+1)-x(i))^2+(y(i+1)-y(i))^2); 
end 

エリア:ポリゴンをプロットし、閉じるための私のスクリプトは、私は今、これらの関数を呼び出すと、それらを組み込むことができますどのように

clf 
axis([0 1 0 1]), hold on 
[x,y]=ginput(1); 
plot(x,y,'o') 
xpol=x; 
ypol=y; 
while 1 
    [x,y,knapp]=ginput(1); 
    if knapp~=1 
     break 
    end 
    xpol=[xpol;x]; 
    ypol=[ypol;y]; 
    plot(xpol(end-1:end),ypol(end-1:end),'o-') 
end 
xpol=[xpol;xpol(1)]; 
    ypol=[ypol;ypol(1)]; 
    plot(xpol(end-1:end),ypol(end-1:end),'o-') 
    hold off 

function A=polyarea(x,y) 
    n=length(x); 
    A=0; 
for i=1:n-1 
    A=A+(x(i+1)+x(i))*(y(i+1)-y(i)); 
end 
A=abs(A)/2; 

ある

私のスクリプトは、これらの2つの値を計算することができますか? manualからまっすぐにそれをコピー

答えて

1

、関数を定義するには、いくつかの方法、最もcommomがあります

  1. File

    名と同じ名前の区切りファイルでこれを保存します例では、関数の:がaverage.m

    function y = average(x) 
    if ~isvector(x) 
        error('Input must be a vector') 
    end 
    y = sum(x)/length(x); 
    end 
    
  2. Local(必要なMathWorks社のMATLAB 2016B以上)

    ちょうどあなたのスクリプトの最後

    % Add it as the last part of your script.  
    function y = myIntegrand(x) 
    y = sin(x).^3; 
    end 
    
  3. Anonymousでそれを保存(旧matlabsで動作します)

    だけでそれを保存スクリプトを実行し、次の行で呼び出します。

    %add to your script 
    myfunction = @(x,y) (x^2 + y^2 + x*y); 
    

そして、あなたは他の関数を呼び出すと、すべての場合には、単に関数を呼び出します。あなたの場合、たとえば、あなたがすべてのステップを呼び出し、グラフに書き込むしたい場合は、この方法でそれを行うことができます。この場合

clf 
axis([0 1 0 1]), hold on 
[x,y]=ginput(1); 
plot(x,y,'o') 
xpol=x; 
ypol=y; 
while 1 
    [x,y,knapp]=ginput(1); 
    if knapp~=1 
     break 
    end 
    xpol=[xpol;x]; 
    ypol=[ypol;y]; 
    plot(xpol(end-1:end),ypol(end-1:end),'o-') 

    if numel(xpol)>2 
     mylen=polylen(xpol,ypol); 
     myarea=polyarea(xpol,ypol); 
     text(0.1,0.1,['len=',num2str(mylen)],'backgroundcolor',[1 1 1]) 
     text(0.1,0.9,['area=',num2str(myarea)],'backgroundcolor',[1 1 1]) 
    elseif numel(xpol)>1 
     mylen=polylen(xpol,ypol); 
     text(0.1,0.1,['len=',num2str(mylen)],'backgroundcolor',[1 1 1]) 
    end 


end 
xpol=[xpol;xpol(1)]; 
ypol=[ypol;ypol(1)]; 
plot(xpol(end-1:end),ypol(end-1:end),'o-') 
if numel(xpol)>2 
     mylen=polylen(xpol,ypol); 
     myarea=polyarea(xpol,ypol); 
     text(0.1,0.1,['len=',num2str(mylen)],'backgroundcolor',[1 1 1]) 
     text(0.1,0.9,['area=',num2str(myarea)],'backgroundcolor',[1 1 1]) 
elseif numel(xpol)>1 
     mylen=polylen(xpol,ypol); 
     text(0.1,0.1,['len=',num2str(mylen)],'backgroundcolor',[1 1 1]) 
end 
hold off 

、機能が分離された.mファイルにあります。

新しいポイントがプロットされるたびに、私は基本的にテキストを上書きしていることに注意してください。それは最もエレガントな解決策ではありませんが、私が思った最初の解決策です。

ifステートメントは、エラー出力を気にしない場合でも無視されます。

+0

私の記事で分かるように、機能は既に定義されています。 3番目のスクリプトでは、これらの関数を使ってポリゴンの面積と長さを計算します。 – Parseval

+1

プロットのテキストにするために私の方法で追加しました。プロンプトまたは他の方法で出力を使用することができます。 – Guto

関連する問題