【问题标题】:Creating many convex hulls MATLAB创建许多凸包 MATLAB
【发布时间】:2013-03-24 23:57:54
【问题描述】:

我是新来的,这是我的第一篇文章。我想知道是否有一种方法可以从 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

【问题讨论】:

  • 请发布您的代码的一小段相关部分和错误描述,以便我们了解您的错误所在。
  • 对于给定的一组点不是只有一个唯一的凸包吗?所有可能的凸包是什么意思?另外请发布代码和错误
  • 你是对的,一组点有一个凸包,但每次我从左边的点计算下一个凸包..

标签: matlab convex-hull


【解决方案1】:

该错误相当具有表现力,您没有指定足够的点(即至少 3 个非共线点)。请说明您要使用此代码实现的目标。

您何时收到此错误?我假设不在循环的第一次运行?在检查是否有超过 3 个点后,您可能会立即删除更多点,然后调用 convhull 所以很有可能少于 3 个点(这仍然忽略了共线性的机会)。报错后size(NewVertices)是什么?

一些侧面的cmets:请在你绘制之前解释整个重塑业务(也许添加一些cmets)。 Points 也可以更快更简单地初始化:

Points = rand(N, 2);

编辑:

通过阅读下面的 cmets,我很清楚您的循环逻辑是错误的。我无法准确计算出您如何尝试删除点以创建新的子集以在其上找到船体,没有 cmets,我不明白您在使用 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 个点上运行的原因。

【讨论】:

  • 我知道这不是答案,但在 cmets 中说得太多了。
  • 我只是想从 NewVertices 矩阵上的左点计算每次新的凸包。如果你在 MATLAB 上运行代码,你会理解我的问题。我只是可以' t 在程序上使用此代码,因为它显示该错误,并且在该行的错误之后 matlab 将停止..
  • 它实际上是在程序完成时出现的,所以它在最后一个循环中。我发现如果你将“while length(NewVertices)>=3”更改为“while length(NewVertices)>= 6" 它在大多数情况下都可以工作,但我认为它的写法很粗略。在错误之后,大小(NewVertices)始终为 1 或 2,我认为这是合乎逻辑的,因为那是 while 案例结束的时候。顺便感谢最后一个提示 ;)
  • 好的,你的逻辑还是很不清楚,但是看看上面的编辑,我想这会解决你的问题。这可能会搞砸循环的第一次运行,但我对此表示怀疑。
  • 我做了一些小的改动,这些改动显示在下面的答案中。再次感谢 DAN ;)
【解决方案2】:

非常感谢丹,

首先,我尝试只更改您所说的那一行,但由于我正在使用的重塑功能,它没有再次起作用。然后我决定更改它们,我让它变得更简单并且它确实有效!

这是在 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

【讨论】:

  • 如果 Dan 的回答对您有帮助,请接受并投票赞成,并可能使用完整的工作代码更新您的问题。这就是stackoverflow的想法;)
  • 我没有足够的声誉这样做,因为我是新来的:/
  • 但是如果他的回答对你有帮助,你应该接受他的回答,因为你问了这个问题,这不应该要求声誉。
  • 我对他的回答投了票,并在下面写了一条评论,说正确的代码在我的回答下面..我也照你说的做了;)
  • 这正是我要说的,我不想拿出你的重塑,因为它们对我来说毫无意义,所以我不确定你对它们做了什么,但这就是我会的已经做到了。
猜你喜欢
  • 2016-05-01
  • 2012-10-26
  • 2014-10-25
  • 2013-10-13
  • 1970-01-01
  • 2012-08-04
  • 2014-04-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多