小谢博客原文地址https://xgs888.top/post/view?id=79
PHP判断点是否在多边形区域内外;根据数学知识的射线法,
射线与几何多边形相交的点的个数为奇数则是在几何内部;
偶数在外部;
-
/**
-
* Created by PhpStorm.
-
* function: inArea
-
* Description: 判断点是否在多边形区域内
-
* User: Xiaoxie
-
* @param $x
-
* @param $y
-
* @param $arr 几何订单坐标
-
* @return int
-
*
-
*/
-
public function inArea($x,$y,$arr)
-
{
-
//点的数量
-
$count = count($arr);
-
$n = 0; //点与线相交的个数
-
$bool = 0;//外
-
for ($i = 0, $j = $count - 1; $i < $count; $j = $i, $i++) {
-
//两个点一条线 取出两个连接点的定点
-
$px1 = $arr[$i][0];
-
$py1 = $arr[$i][1];
-
$px2 = $arr[$j][0];
-
$py2 = $arr[$j][1];
-
//$x的水平位置画射线
-
if($x>=$px1 || $x>= $px2)
-
{
-
//判断$y 是否在线的区域
-
if(($y>=$py1 && $y<=$py2) || ($y>=$py2 && $y<= $py1)){
-
-
-
if (($y == $py1 && $x == $px1) || ($y == $py2 && $x == $px2)) {
-
-
#如果$x的值和点的坐标相同
-
$bool = 2;//在点上
-
return $bool;
-
-
}else{
-
$px = $px1+($y-$py1)/($py2-$py1)*($px2-$px1) ;
-
if($px ==$x)
-
{
-
$bool = 3;//在线上
-
}elseif($px< $x){
-
$n++;
-
}
-
-
}
-
}
-
}
-
-
}
-
if ($n%2 != 0) {
-
$bool = 1;
-
}
-
return $bool;
-
}
测试数组
-
$arr = [
-
['9.4','12.04'],
-
['6.68','8.61'],
-
['9.05','6.06'],
-
['6.24','3.87'],
-
['10.02','2.55'],
-
-
['14.06','4.13'],
-
-
['16.35','7.56'],
-
-
['11.69','8.35'],
-
];
-
-
$x =15.73;
-
$y = 5.62;
-
//在外
-
$x = 9.97;
-
$y = 4.96; //在内
评论(0)