我有一个问题,涉及确定两个向量是否包含两个相同的元素。元素可以位于向量的任何位置,但它们必须是相邻的。
更多示例:
例如,比较以下两个向量将返回false。
向量1 = [0, 1, 2, 3, 4, 6]
向量2 = [1, 4, 2, 0, 5, 3]
但是以下两个向量将返回true:
向量1 = [0, 1, 2, 3, 4, 5]
向量2 = [4, 2, 1, 5, 0, 3]
因为第一个向量中的1,2对应于第二个向量中的2,1。
真:
向量1 = [0, 1, 2, 3, 4, 5]
向量2 = [1, 4, 2, 0, 5, 3]
{5,0}是一对,尽管在向量上循环(我最初说这是假的,感谢'Vlad from Moscow'指出)。
真:
向量1 = [0, 1, 2, 3, 4, 5]
向量2 = [4, 8, 6, 2, 1, 5, 0, 3]
即使它们不在同一位置,{2,1}仍然是一对。
实际应用是,我有一个存储N个点的向量中的多边形(面)。为了确定一组多边形是否完全包围一个三维体积,我测试每个面以确保每个边都被另一个面共享(其中一条边由两个相邻点定义)。
因此,Face包含指向Points的指针向量...
检查面是否被包围,可以使用Face类的成员函数...
更多示例:
例如,比较以下两个向量将返回false。
向量1 = [0, 1, 2, 3, 4, 6]
向量2 = [1, 4, 2, 0, 5, 3]
但是以下两个向量将返回true:
向量1 = [0, 1, 2, 3, 4, 5]
向量2 = [4, 2, 1, 5, 0, 3]
因为第一个向量中的1,2对应于第二个向量中的2,1。
真:
向量1 = [0, 1, 2, 3, 4, 5]
向量2 = [1, 4, 2, 0, 5, 3]
{5,0}是一对,尽管在向量上循环(我最初说这是假的,感谢'Vlad from Moscow'指出)。
真:
向量1 = [0, 1, 2, 3, 4, 5]
向量2 = [4, 8, 6, 2, 1, 5, 0, 3]
即使它们不在同一位置,{2,1}仍然是一对。
实际应用是,我有一个存储N个点的向量中的多边形(面)。为了确定一组多边形是否完全包围一个三维体积,我测试每个面以确保每个边都被另一个面共享(其中一条边由两个相邻点定义)。
因此,Face包含指向Points的指针向量...
std::vector<Point*> points_;
检查面是否被包围,可以使用Face类的成员函数...
bool isSurrounded(std::vector<Face*> * neighbours)
{
int count = 0;
for(auto&& i : *neighbours) // for each potential face
if (i != this) // that is not this face
for (int j = 0; j < nPoints(); j++) // and for each point in this face
for (int k = 0; k < i->nPoints(); k++ ) // check if the neighbour has a shared point, and that the next point (backwards or forwards) is also shared
if ( ( this->at(j) == i->at(k) ) // Points are the same, check the next and previous point too to make a pair
&& ( ( this->at((j+1)%nPoints()) == i->at((k+1)%(i->nPoints())) )
|| ( this->at((j+1)%nPoints()) == i->at((k+i->nPoints()-1)%(i->nPoints())) )))
{ count++; }
if (count > nPoints() - 1) // number of egdes = nPoints -1
return true;
else
return false;
}
显然,这段代码很糟糕。如果我两周后再来看它,可能就理解不了了。所以面对原始问题,你该如何清晰地检查这两个向量?
请注意,如果你试图解密提供的代码,“at(int)”返回一个面中的点,“nPoints()”返回一个面中的点数。
非常感谢。