这是我的第一篇文章,所以请善待。
我有一个3~10坐标的矩阵,我希望将这些点连接成最大尺寸的多边形。
我尝试使用fill()[1]来生成一个图,但是如何计算该图的面积?有没有办法将图转换回矩阵?
你会告诉我什么?
提前谢谢!
[1]
x1 = [ 0.0, 0.5, 0.5 ]; y1 = [ 0.5, 0.5, 1.0 ]; fill ( x1, y1, 'r' );
[更新]
感谢您对MatlabDoug的回答,但我认为我没有明确表达我的问题。我希望将这些点的所有连接成最大尺寸的多边形。
有任何新想法吗?
答案 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左右获得一些非常狂野的图片!