基于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。
谢谢!
答案 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