如果多边形未对齐,则它们必须对齐。我会通过找到多边形的中心(X 中的平均值,Y 中的平均值)然后通过矩阵变换增量旋转多边形,将点投影到轴之一并使用最小 stdev 的角度来对齐形状(你也可以使用主成分)。为了找到交点,一个简单的算法将定义一个点网格。对于每个点,维护一个多边形或另一个多边形或两者(联合)内的点数(有简单快速的算法,例如http://wiki.unity3d.com/index.php?title=PolyContainsPoint)。计算多边形 1 和多边形 2 的点,除以多边形 1 或多边形 2 中的点数,您就可以粗略估计多边形重叠的比例(取决于网格采样)。相交区域将由对应于 AND 操作的点给出。
例如。
function get_polygon_intersection($arr, $user_array)
{
$maxx = -999; // choose sensible limits for your application
$maxy = -999;
$minx = 999;
$miny = 999;
$intersection_count = 0;
$not_intersected = 0;
$sampling = 20;
// find min, max values of polygon (min/max variables passed as reference)
get_array_extent($arr, $maxx, $maxy, $minx, $miny);
get_array_extent($user_array, $maxx, $maxy, $minx, $miny);
$inc_x = $maxx-$minx/$sampling;
$inc_y = $maxy-$miny/$sampling;
// see if x,y is within poly1 and poly2 and count
for($i=$minx; $i<=$maxx; $i+= $inc_x)
{
for($j=$miny; $j<=$maxy; $j+= $inc_y)
{
$in_arr = pt_in_poly_array($arr, $i, $j);
$in_user_arr = pt_in_poly_array($user_array, $i, $j);
if($in_arr && $in_user_arr)
{
$intersection_count++;
}
else
{
$not_intersected++;
}
}
}
// return score as percentage intersection
return 100.0 * $intersection_count/($not_intersected+$intersection_count);
}