输入: x = 1, y = 3, coords = [0,0,0,4,4,4,2,2,4,0,0,0] 输出:true
比赛的时候计算点到连线的距离,但是发现漏洞太多,没法解决。搜了一下巨佬们的解法,发现有个大佬的解法思路都很清晰。
思路:交点法(射线法):如图所示
根据 给定的点 与 两个点之间连线的交点数量 判断是否存在于区域内部。
步骤:
首先,假定以右侧交点数量为判断依据;
然后,排除不存在交点的情况;
其次,算出相同y下,交点的 xr 与 x 的大小,如果x<xr,则说明有右交点,否则无右交点;
最后,根据交点数量 判断 对错【偶数在外为false,奇数在内为true】
注意:题目中表示,给定的点不会出现在边界上,可以理解为不考虑边界上的点。
代码:
class Solution {
public:
int countnum = 0;
bool flag = true;
bool isPointInPolygon(double x, double y, vector<double>& coords) {
int n = coords.size();
for (int i = 0; i <= n - 4; i+=2)// coords坐标存储方式:x1,y1,x2,y2....
{
double x1 = coords[i];
double y1 = coords[i + 1];
double x2 = coords[i + 2];
double y2 = coords[i + 3];
//不存在交点的情况,以及连线为水平的情况【为求交点考虑】
if (min(y1,y2)>y || max(y1,y2)<=y||y1==y2)continue;
else if(x1==x2&&x1>x)countnum++;//如果连线竖直【为求k考虑】,且 大于 x
else//否则计算 交点
{
double k = (y2 - y1) / (x2 - x1);
double xr = (k * x1 + y - y1) / k;
if (x < xr)countnum++;
}
}
if (countnum % 2 == 0)flag = false;
return flag;
}
};
数学能力很重要啊~