如何按点(x1,y1)的距离按升序对坐标进行排序?

时间:2012-09-17 09:08:06

标签: c++ stl

我有std::set<std::pair<float,float>>表示地图上的点(2d,x和y值),我有一个值为x1和y1的点。如何按点(x1,y1)的距离按升序排序?

2 个答案:

答案 0 :(得分:6)

std::set是一个有序容器,在插入时会进行排序,具体取决于可以使用第二个模板参数指定的排序条件。因此,使用带有谓词的set,该谓词根据与参考点的距离返回true或false。

struct DistanceCompare
{
  DistanceCompare(const std::pair<float,float>& point) : point_(point) {} 
  bool operator()(const std::pair<float,float>& lhs, 
                  const std::pair<float,float>& rhs) const
  {
    return distance2(lhs) < distance2(rhs);
  };

 private:
  float distance2(const std::pair<float,float>& point) const
  {
    // calculate distance squared between point and point_
    const float x = point.first  - point_.first;
    const float y = point.second - point_.second;
    return x*x + y*y;

  }
  std::pair<float, float> point_;
};

....
std::pair<float,float> refPoint = ....;
DistanceCompare comp(refPoint);
std::set<std::pair<float, float>, DistanceCompare> pointSet(comp);

足以比较距离的平方,从而避免调用std::sqrt

答案 1 :(得分:-1)

两点之间的距离可以如下计算:

xd = x2-x1;
yd = y2-y1;
Distance = SquareRoot(xd*xd + yd*yd);

Distance的值可以用作排序参数。