2017-09-25 1 views
-1

Ich versuche ein Skript zu schreiben, das die Länge und Fläche eines Polygons mit Ginput berechnet. Also egal wie viele Punkte ich wähle, ich sollte die Fläche und Länge angezeigt bekommen. Ich habe zwei Funktionen erstellt, eine für die Berechnung der Fläche und eine für die Berechnung der Länge.Länge und Fläche des Polygons berechnen

Länge:

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 

Gebiet:

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; 

Mein Skript zum Plotten und Schließen des Polygons

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 

Wie kann ich jetzt auf diese Funktionen aufrufen und integrieren sie in mein Skript, damit sie diese beiden Werte berechnen können?

Antwort

1

Kopieren Sie es gerade aus den manual, gibt es ein paar Möglichkeiten, eine Funktion zu definieren, die commom:

  1. File

    speichert in einer separaten Datei mit dem Namen gleich den Namen der Funktion, in dem Beispiel: average.m

    function y = average(x) 
    if ~isvector(x) 
        error('Input must be a vector') 
    end 
    y = sum(x)/length(x); 
    end 
    
  2. Local (erforderlich Matlab 2016b oder höher)

    Gerade am Ende des Skriptes speichern

    % Add it as the last part of your script.  
    function y = myIntegrand(x) 
    y = sin(x).^3; 
    end 
    
  3. Anonymous (Werke in alter matlabs)

    Nur speichern in das Skript und rufe es in den nächsten Zeilen auf.

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

Und in allen Fällen, rufen Sie einfach die Funktion wie jede andere Funktion aufrufen. Zum Beispiel in Sie Fall, wenn Sie wollen, dass es jeden Schritt nennen und es in der Grafik schreiben, können Sie es auf diese Weise tun:

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 

In diesem Fall sind die Funktionen in einer separaten .m-Datei .

Beachten Sie, dass ich den Text grundsätzlich jedes Mal überschreibe, wenn ein neuer Punkt geplottet wird. Es ist nicht die eleganteste Lösung, aber es ist die erste, die ich dachte.

Die if Anweisungen können vernachlässigt werden, falls Sie die Fehlerausgabe nichts ausmacht, es funktioniert immer noch ohne es.

+0

Wie Sie in meinen Posts sehen können, sind die Funktionen bereits definiert. Im dritten Skript möchte ich nun diese Funktionen verwenden, um Fläche und Länge der Polygone zu berechnen. – Parseval

+1

Ich habe es auf meine Art hinzugefügt, um es zu einem Text in der Handlung zu machen. Sie können die Ausgabe in Prompt oder einer anderen Methode verwenden. – Guto

Verwandte Themen