排序不遵守排序函数的向量

时间:2013-04-27 21:34:10

标签: c++ xcode c++11 geometry

我正在尝试根据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进行编译。

1 个答案:

答案 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

换句话说,您的排序功能是说一个值小于另一个,反之亦然。显然没有排序算法可以处理它。