已知一个多边形的所有顶点坐标,如果确定一点是否在这个多边形内?js或php 请给出代码 在线等谢谢
发布网友
发布时间:2022-04-29 09:43
我来回答
共2个回答
懂视网
时间:2022-04-29 14:04
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; //在内
更多PHP相关知识,请访问PHP教程!
热心网友
时间:2022-04-29 11:12
原理:从要判断的点向x轴发射一条射线,如果射线与多边形的边有偶数次相交,那么点不在多边形内;奇数次相交,那么点在多边形内
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gbk">
<title>img usemap属性</title>
</head>
<script>
function isPointInLine(point,linePoint1,linePoint2)
{
//是否一个点向x轴的射线穿透线段,有交点
var maxY=(linePoint1.y>linePoint2.y)?linePoint1.y:linePoint2.y;
var minY=(linePoint1.y<linePoint2.y)?linePoint1.y:linePoint2.y;
//alert("maxY" + maxY);
//alert("minY = " + minY);
var re=false;
if(point.y<maxY && point.y>=minY)
{
a1 = point.x;
a2 = (linePoint2.x-linePoint1.x)*(point.y-linePoint1.y)/(linePoint2.y-linePoint1.y);
//alert(a1);
//alert(a2);
//alert(a1 <= a2);
if(parseFloat(point.x) <= parseFloat(( linePoint1.x+(linePoint2.x-linePoint1.x)*(point.y-linePoint1.y)/(linePoint2.y-linePoint1.y) )) )
{
re=true;
}
}
//alert("point :" + point.x + ":" + point.y + ";")
//alert("linePoint1 :" + linePoint1.x + ":" + linePoint1.y + ";")
//alert("linePoint2 :" + linePoint2.x + ":" + linePoint2.y + ";")
//alert(re);
return(re);
}
function isPointInPolygon(point,poly)
{
//是否点在多边形里
var crossNum=0;
var re=true;
for(var i=0;i<poly.length-1;i++)
{
if(isPointInLine(point,poly[i],poly[i+1]))
{
crossNum++;
}
}
if((crossNum % 2)==0)
{
re=false;
}
return(re);
}
function clickme()
{
var pa = document.getElementById("point").value.split(",");
var p = {x:pa[0],y:pa[1]};
var poa = document.getElementById("poly").value.split(",");
var po = new Array();
for(var i=0;i<poa.length/2;i++){
po[i]={x:poa[2*i],y:poa[2*i+1]};
};
//for(var i=0;i<po.length;i++)
//{
// alert(po[i].x);
// alert(po[i].y);
//}
//alert(p.x);
//alert(p.y);
alert(isPointInPolygon(p,po));
}
</script>
<body>
<br>
<input type="text" id="point" value="0.5,0.49" />点的横竖坐标,用逗号分隔
<br>
<input type="text" id="poly" value="0,0,0.75,0.75,1,0,1,1,0,1" />按照逆时针方向 多边形点的横竖坐标坐标0
<input type="button" id="btn" value="点击我" onclick="clickme();">
</body>
</html>