连接点和计算区域

时间:2009-10-02 15:36:57

标签: matlab plot

这是我的第一篇文章,所以请善待。

我有一个3~10坐标的矩阵,我希望将这些点连接成最大尺寸的多边形。

我尝试使用fill()[1]来生成一个图,但是如何计算该图的面积?有没有办法将图转换回矩阵?

你会告诉我什么?

提前谢谢!

[1]

x1 = [ 0.0, 0.5, 0.5 ];
y1 = [ 0.5, 0.5, 1.0 ];
fill ( x1, y1, 'r' );

[更新]

感谢您对MatlabDoug的回答,但我认为我没有明确表达我的问题。我希望将这些点的所有连接成最大尺寸的多边形。

有任何新想法吗?

2 个答案:

答案 0 :(得分:3)

 x1 = rand(1,10)
 y1 = rand(1,10)

 vi = convhull(x1,y1)
 polyarea(x1(vi),y1(vi))

 fill ( x1(vi), y1(vi), 'r' ); 
 hold on
 plot(x1,y1,'.')
 hold off

这里发生的事情是CONVHULL告诉我们哪些顶点(vi)在凸包上(包围所有点的最小多边形)。知道哪些是在凸包上,我们向MATLAB询问POLYAREA的区域。

最后,我们使用您的FILL命令绘制多边形,然后使用PLOT将点放在那里进行确认。

答案 1 :(得分:0)

正如Amro评论的那样,找到正确的积分顺序是困难的部分。这个功能是否足够?

function [idx] = Polyfy(x, y)
% [idx] = Polyfy(x, y)
% Given vectors x and y that contain pairs of points, find the order that
% joins them into a polygon. fill(x(idx),y(idx),'r') should show no holes.

%ensure column vectors
if (size(x,1) == 1)
  x = x';
end
if (size(y,1) == 1)
  y = y';
end

% vectors from centroid of points to each point
vx = x - mean(x);
vy = y - mean(y);
% unit vectors from centroid towards each point
v = (vx + 1i*vy)./abs(vx + 1i*vy);
vx = real(v);
vy = imag(v);

% rotate all unit vectors by first
rot = [vx(1) vy(1) ; -vy(1) vx(1)];
v = (rot*[vx vy]')';

% find angles from first vector to each vector
angles = atan2(v(:,2), v(:,1));
[angles, idx] = sort(angles);
end

想法是找到点的质心,然后找到从质心到每个点的向量。您可以将这些向量视为三角形的边。多边形由三角形组成,其中每个向量仅用作“左”和“右”一次,并且不跳过任何向量。这归结为围绕质心按角度排序矢量。

我选择通过将矢量标准化为单位长度,选择其中一个作为旋转矢量,然后旋转其余部分来完成此操作。这让我只需使用atan2来找到角度。可能有更快和/或更优雅的方式来做到这一点,但我把自己与三角形身份混淆。最后,对这些角度进行排序可以为点形成所需多边形的正确顺序。

这是测试功能:

function [x, y] = TestPolyArea(N)
x = rand(N,1);
y = rand(N,1);
[indexes] = Polyfy(x, y);
x2 = x(indexes);
y2 = y(indexes);
a = polyarea(x2, y2);
disp(num2str(a));
fill(x2, y2, 'r');
hold on
plot(x2, y2, '.');
hold off
end

你可以通过N = 100左右获得一些非常狂野的图片!