如何正确确定环点的方向?

时间:2011-10-23 03:10:28

标签: math geometry polygon

基于How to determine if a list of polygon points are in clockwise order?

我想出了以下代码:

bool PointsClockwise(const std::vector<MyPoint>& points)
{  
  double sum = 0.0;
  for(size_t i = 0; i < points.size() - 1; ++i)
    sum += (points[i+1].x()-points[i].x()) * (points[i+1].y()+points[i].y());

  return sum > 0.0;
}

然而,在某些情况下,这似乎有错误的结果。以下面的戒指为例:

LINESTRING(0 119,0 60,694 70,704 72,712 77,719 83,723 92,725 102,723 111,719 120,712 126,703 130)

按逆时针顺序,但该函数返回true。

谢谢!

2 个答案:

答案 0 :(得分:1)

您错过了总和中的一个线段 - 即连接最后一个点与第一个点的线段。 试试这个:

bool PointsClockwise(const std::vector<MyPoint>& points)
{  
  double sum = 0.0;
  for(size_t i = 0; i < points.size() - 1; ++i)
    sum += (points[i+1].x()-points[i].x()) * (points[i+1].y()+points[i].y());

  sum += (points[0].x()-points[points.size()-1].x()) * (points[0].y()+points[points.size()-1].y());

  return sum > 0.0;
}

答案 1 :(得分:0)

您需要包含案例i == points.size() - 1,但要做到这一点,您需要在循环中进行一些模运算,否则将最后一次迭代分开。实际上,只需将sum初始化为最后一次迭代:

double sum = (points[0].x() - points[points.size() - 1].x())
  * (points[0].y() + points[points.size() - 1].y());

并在i < points.size() - 1

结束迭代