计算多边形

时间:2017-09-25 12:39:13

标签: matlab

我试图编写一个使用ginput计算多边形长度和面积的脚本。所以无论我选择多少点,我都应该显示区域和长度。我创建了两个函数,一个用于计算面积,另一个用于计算长度。

长度:

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

区域:

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;

我绘制和关闭多边形的脚本是

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

我现在如何调用这些函数并将它们合并到我的脚本中,以便它们可以计算这两个值?

1 个答案:

答案 0 :(得分:1)

直接从manual复制,有几种方法可以定义一个函数,最常见的是:

  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(需要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);
    
  4. 在所有情况下,只需在调用任何其他函数时调用该函数。例如,在你的情况下,如果你想每一步都调用它并将它写在图中,你就可以这样做:

    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语句可以忽略,以防您不介意错误输出,如果没有它,它仍然可以正常工作。