2013-04-03 57 views
0

我在这里是新的,这是我的第一篇文章..我想知道是否有一种方法可以从100个随机点计算所有可能的凸壳..我创建了一个代码这样做的权利,但它给我一个错误convhull和该部分下的所有东西都无法计算..换句话说,我想知道是否有一种方法,我可以使用函数convhull内循环没有得到一个错误..创建多个凸壳MATLAB

这里是代码

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

请发表您的代码的一小部分相关的和错误的描述,我们可以看到你要去哪里错了。 – wakjah

+0

对于给定的一组点,是不是只有一个独特的凸包?所有可能的凸包是什么意思?也请张贴代码和错误 – Dan

+0

你是对的有一个点的一个凸包,但每次我计算从左点的下一个凸包.. – co2ark5

回答

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点。

+0

我知道这不是一个答案,但它也是在评论中要说的很多。 – Dan

+0

我只是想从NewVertices矩阵中的每个点上计算新的凸包。如果你在MATLAB上运行代码,你会明白我的问题..我只是不能在程序中使用此代码因为它显示错误,并在该行的错误matlab将停止.. – co2ark5

+0

它实际上出现时,程序完成,所以它在最后一个循环..我想通过,如果你改变“长度(NewVertices)”= 3“到“长度(NewVertices)> = 6”它将工作的大部分时间,但它大致写我认为..在错误的大小(NewVertices)总是1或2这是逻辑我认为'因为那时候案例结束.. 顺便说一句,感谢您的最后一个技巧;) – co2ark5

1

非常感谢丹,

首先,我试图改变只是你说行,但它没有再工作“的我使用..在重塑功能的原因。然后我决定改变他们和我做了它更简单,它确实工作!

这里是最终的代码能够正确工程与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 
+0

请接受和upvote丹的答案,如果它帮助你,也许更新你的问题与完整的工作代码。这是计算器的想法;) –

+0

我没有足够的声誉这样做因为我是新来的:/ – co2ark5

+0

但你应该接受他的答案,如果它帮助你,这不应该因为你问这个问题需要声望。 –