创建许多凸包MATLAB

时间:2013-04-03 10:48:48

标签: matlab convex-hull

我是新来的,这是我的第一篇文章..我想知道是否有办法从100个随机点计算所有可能的凸包..我已经创建了一个代码来做到这一点,但它在convhull上给我一个错误,并且该部分下面的所有内容都无法计算..换句话说,我想知道是否有一种方法可以在for循环中使用函数convhull而不会出现错误..

这是代码

hold on
N=100;
Points = zeros(N,2);
for i=1:N
    Points(i,1)= rand(1,1)*100;
    Points(i,2)= rand(1,1)*100;
end

SortedX = sortrows(Points,1);
NewVertices = SortedX;

X = reshape(SortedX(:,1),2,[]);
X = X(:);
Y = reshape(SortedX(:,2),2,[]);
Y = Y(:);
plot(X,Y,'*');

while length(NewVertices)>=3
    NewVertices = NewVertices(NewVertices~=0);
    rowsNV = length(NewVertices(:,1));
    NewVertices = reshape(NewVertices,rowsNV/2,2);
    XNV = reshape(NewVertices(:,1),rowsNV/2,[]);
    XNV = XNV(:);
    YNV = reshape(NewVertices(:,2),rowsNV/2,[]);
    YNV = YNV(:);
    K = convhull(XNV,YNV);
    plot(XNV(K),YNV(K),'r-');
    for i=1:length(K)-1
        NewVertices(K(i),1)=0;
        NewVertices(K(i),2)=0;
    end

end

这是错误

Error using convhull
Error computing the convex hull. Not
enough unique points specified.

Error in test2 (line 28)
    K = convhull(XNV,YNV);

提前致谢

co2ark5

这里是与DAN帮助正确合作的最终法典

hold on
N=100;
Points = rand(N,2);

SortedX = sortrows(Points,1);
NewVertices = SortedX;

plot(SortedX(:,1),SortedX(:,2),'*');

while length(NewVertices)>=3
    X=NewVertices(:,1);
    Y=NewVertices(:,2);
    K = convhull(X,Y);
    plot(X(K),Y(K),'r-');
    for i=1:length(K)-1
        NewVertices(K(i),1)=0;
        NewVertices(K(i),2)=0;
    end
    NewVertices = NewVertices(any(NewVertices,2),:);
end

2 个答案:

答案 0 :(得分:1)

错误是相当富有表现力的,你没有指定足够的点数(即至少3个非共线点)。请解释一下您尝试使用此代码实现的目标。

你什么时候收到这个错误?我假设没有第一次循环运行?在检查有超过3个点之后,你可以立即删除更多的点,然后调用convhull,这样很可能少于3个点(这仍然忽略了共线性的可能性)。错误发生后,size(NewVertices)是什么?

有些方面评论:请在绘制之前解释整个重塑业务(可能会添加一些评论)。此外,Points可以更快更简单地初始化:

Points = rand(N, 2);

修改

通过阅读下面的评论,我很清楚循环的逻辑是错误的。我无法确切地知道你是如何试图删除点来创建新的子集来找到船体,没有评论,我没有得到你正在做的reshape,但我是非常确定你需要做的就是将你的循环的第一行移到最后:

while length(NewVertices)>=3

    rowsNV = length(NewVertices(:,1));
    NewVertices = reshape(NewVertices,rowsNV/2,2);
    XNV = reshape(NewVertices(:,1),rowsNV/2,[]);
    XNV = XNV(:);
    YNV = reshape(NewVertices(:,2),rowsNV/2,[]);
    YNV = YNV(:);
    K = convhull(XNV,YNV);
    plot(XNV(K),YNV(K),'r-');
    for i=1:length(K)-1
        NewVertices(K(i),1)=0;
        NewVertices(K(i),2)=0;
    end

    NewVertices = NewVertices(NewVertices~=0);

end

通过这种方式,你可以在检查点数后立即找到你的船体,而不是检查,然后去掉点,这就是你的循环以1 - 2点运行的原因。

答案 1 :(得分:1)

非常感谢DAN,

首先我试图改变你说的那条线,但它没有再次工作'因为我正在使用的重塑功能..然后我决定改变它们,我让它变得更简单,它确实有效!

这是与DAN'S HELP正确协作的最终法规

hold on
N=100;
Points = rand(N,2);

SortedX = sortrows(Points,1);
NewVertices = SortedX;

plot(SortedX(:,1),SortedX(:,2),'*');

while length(NewVertices)>=3
    X=NewVertices(:,1);
    Y=NewVertices(:,2);
    K = convhull(X,Y);
    plot(X(K),Y(K),'r-');
    for i=1:length(K)-1
        NewVertices(K(i),1)=0;
        NewVertices(K(i),2)=0;
    end
    NewVertices = NewVertices(any(NewVertices,2),:);
end