我正在尝试根据Sort points in clockwise order?按顺时针顺序对点的矢量进行排序。
当我手动计算各个点的结果时,sort函数的逻辑是有意义的并检查出来。但是,结果向量似乎不是根据排序函数排序的。例如,以下是一次特定运行后的前4个元素:
[22.3701,450.519,-1045] <- correct
[-22.429,-29.0513,-1006] <- should be in position 2
[-147.806,65.0482,-1095] <- should be in position 3
[68.0652,590.091,-942] <- should be in position 1
这种情况应该被排序算法的第一个保护条款捕获:
if ( a.x >= 0 && b.x < 0 ) return true
变为:
if ( 68.0652 >= 0 && -22.429 < 0 ) return true
当然应该将(68.0652,590.091)点更高。
这是我对sort函数的实现,简化了因为我的中心点是(0,0):
bool sortVectorsClockwise( const Vec3f &a, const Vec3f &b )
{
if ( a.x >= 0 && b.x < 0 ) return true;
if ( a.x == 0 && b.x == 0 ) return a.y > b.y;
float det = a.x * b.y - b.x * a.y;
if ( det < 0 ) return true;
if ( det > 0 ) return false;
// points a and b are on the same line from the center, check which is
// closer to the center
return a.xy().length() > b.xy().length();
}
我打电话打印结果如下:
sort( points.begin(), points.end(), sortVectorsClockwise );
for ( auto &p : points ) {
cout << p << endl;
}
我正在使用XCode 4.6,LLVM 4.2,C ++ 11进行编译。
答案 0 :(得分:3)
我怀疑(实际上比我怀疑的更糟)。我试过这段代码
int main()
{
Vec3f a(22.3701, 450.519, -1045);
Vec3f b(-22.429,-29.0513,-1006);
if (sortVectorsClockwise(a, b))
cout << "a<b\n";
if (sortVectorsClockwise(b, a))
cout << "b<a\n";
}
输出
a<b
b<a
换句话说,您的排序功能是说一个值小于另一个,反之亦然。显然没有排序算法可以处理它。