分区标准::2D点的矢量

Partition std::vector of 2D points

本文关键字:2D 标准 分区      更新时间:2023-10-16

假设我有一个std::vector<Point>,其中Pointstruct Point { double x; double y;}我想将这样的向量划分为组(桶),其中同一桶中的所有点彼此之间具有相同的欧几里得范数(例如dist(PointA,PointB)==X,其中X是常数)。我决定使用std::map与自定义排序运算符执行这样的任务

struct ClosePoints
{
    bool operator()(Point const& A, Point const& B) const
    {
        bool same = dist(A,B) < x;
        //If not close enough use lexical sort
        return same ? false : std::tie(A.x, A.y) < std::tie(B.x,); 
    }
}

分区代码:

std::map<Point, std::list<Point>, ClosePoints> map;
for(const auto& p : pointsVector)
    map[p].push_back(p);

经过一些测试和打印桶,我注意到一些遵守给定欧几里得范数极限X的点在不同的桶中结束。我不明白为什么会这样?

问题是您定义的比较运算符不提供等价关系。例如,你可以有一个接近a和C的点B,但点a和C可能相距很远。因此,如果你将B与A和C进行比较,你会将它们与B放在同一个篮子里。然而,如果你先比较A和C,结果将是不可预测的。