我试图编写一个使用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
我现在如何调用这些函数并将它们合并到我的脚本中,以便它们可以计算这两个值?
答案 0 :(得分:1)
直接从manual复制,有几种方法可以定义一个函数,最常见的是:
将此保存在名称等于函数名称的单独文件中,例如: average.m
function y = average(x)
if ~isvector(x)
error('Input must be a vector')
end
y = sum(x)/length(x);
end
Local(需要matlab 2016b或更高版本)
只需将其保存在脚本的末尾
% Add it as the last part of your script.
function y = myIntegrand(x)
y = sin(x).^3;
end
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
语句可以忽略,以防您不介意错误输出,如果没有它,它仍然可以正常工作。