“射线测试法”判断点是否在任意多边形范围内:
1.将多边形顶点坐标存储在一个数组中
2.从给定点绘制一条向任意方向的射线
3.计算该射线与多边形所有边界的交点,并记录所有交点
4.如果交点数为奇数,则给定点位于多边形内部,否则不在。
bool pointInPolygon(Eigen::Vector2f point, std::vector<Eigen::Vector2f> polygonPeaks)
{
int n = polygonPeaks.size();
bool inside = false;
for (int i = 0, j = n - 1; i < n; j = i++) {
Eigen::Vector2f curPoint = polygonPeaks.at(i);
Eigen::Vector2f prePoint = polygonPeaks.at(j);
if ((curPoint.y() > point.y()) != (prePoint.y() > point.y()) &&
(point.x() < (prePoint.x() - curPoint.x()) * (point.y() - curPoint.y()) / (prePoint.y() - curPoint.y()) + curPoint.x()))
inside = !inside;
}
return inside;
}
代码中point为待判断的点坐标,polygonPeaks为多边形顶点坐标,按绘制多边形顺序。