function check($point, $polygon)
{
//记录相交次数的计数器
$count = 0;
//记录顶点与测量点线段与x轴平行的次数
$px = 0;
//遍历多边形顶点
for($i = 0; $i < count($polygon); $i++)
{
$p1 = $polygon[$i];//当前顶点
$p2 = $polygon[($i + 1) % count($polygon)];//下一个顶点
//如果两个顶点的y坐标均比测量点y坐标大,则跳过
if($p1[1] > $point[1] && $p2[1] > $point[1])
{
continue;
}
//如果两个顶点的y坐标均比测量点y坐标小,则跳过
if($p1[1] < $point[1] && $p2[1] < $point[1])
{
continue;
}
//如果测量点的y坐标在两个顶点的y坐标之间,或者如果测量点的x坐标在两个顶点的x坐标之间
if((($point[1] > $p1[1]) != ($point[1] > $p2[1])) || (($point[0] > $p1[0]) != ($point[0] > $p2[0])))
{
//如果计算斜率的被除数均不为零
if(($p1[0] - $p2[0]) != 0 && ($p1[0] - $point[0]) != 0)
{
//如果两条线段的斜率相等,则说明该点在两个顶点相连的边上,直接返回true
if((($p1[1] - $p2[1]) / ($p1[0] - $p2[0])).'' == (($p1[1] - $point[1]) / ($p1[0] - $point[0])).'')
{
return true;
}
}
//如果两个被除数均为零,则该点也在两个顶点相连的线段上,直接返回true
elseif(($p1[0] - $p2[0]) == 0 && ($p1[0] - $point[0]) == 0)
{
return true;
}
}
//在排除点在线段上之后,若两个点的y坐标相等,说明与x轴平行,跳过当次循环
if($p1[1] === $p2[1])
{
continue;
}
//根据斜率计算公式计算出相交点的x坐标
$x = ($point[1] - $p1[1]) * ($p1[0] - $p2[0]) / ($p1[1] - $p2[1]) + $p1[0];
//如果x坐标比测试点x坐标大,说明在测试点的右边,计数器加1
if($x > $point[0])
{
$count++;
// echo $p1[1].' '.$point[1].' '.$p2[1].' '.$point[1]."\n";
if($p1[1] == $point[1] || $p2[1] == $point[1])
{
$px++;
}
}
}
$count -= $px / 2;
//echo "$count : $px \n";
//如果相交点数量为偶数 则不在多边形内部 返回false,否则返回true
if($count %2 === 0)
{
return false;
}
else
{
return true;
}
}