How to determine the center of a Polygon.
Read first: PHP: How to calculate signed area of a Polygon
Method 1:
// Find the polygon's centroid. function getCenter($polygon) { $NumPoints = count($polygon); if($polygon[$NumPoints-1] == $polygon[0]){ $NumPoints--; }else{ //Add the first point at the end of the array. $polygon[$NumPoints] = $polygon[0]; } // Find the centroid. $X = 0; $Y = 0; For ($pt = 0 ;$pt<= $NumPoints-1;$pt++){ $factor = $polygon[$pt][0] * $polygon[$pt + 1][1] - $polygon[$pt + 1][0] * $polygon[$pt][1]; $X += ($polygon[$pt][0] + $polygon[$pt + 1][0]) * $factor; $Y += ($polygon[$pt][1] + $polygon[$pt + 1][1]) * $factor; } // Divide by 6 times the polygon's area. $polygon_area = ComputeArea($polygon); $X = $X / 6 / $polygon_area; $Y = $Y / 6 / $polygon_area; return array($X, $Y); }
Method 2:
function getCenter($polygon) { $NumPoints = count($polygon); if($polygon[$NumPoints-1] == $polygon[0]){ $NumPoints--; }else{ //Add the first point at the end of the array. $polygon[$NumPoints] = $polygon[0]; } $x = 0; $y = 0; $lastPoint = $polygon[$NumPoints - 1]; for ($i=0; $i<=$NumPoints - 1; $i++) { $point = $polygon[$i]; $x += ($lastPoint[0] + $point[0]) * ($lastPoint[0] * $point[1] - $point[0] * $lastPoint[1]); $y += ($lastPoint[1] + $point[1]) * ($lastPoint[0] * $point[1] - $point[0] * $lastPoint[1]); $lastPoint = $point; } $x /= 6*ComputeArea($polygon); $y /= 6*ComputeArea($polygon); return array($x, $y); }
Example 1:
$polygon = array( array(0,6), array(4,6), array(2,3), array(4,0), array(0,0), array(0,6), ); var_dump(getCenter($polygon));
Result:
array(2) {
[0]=>
float(1.55555555556)
[1]=>
int(3)
}
$polygon = array( array(0,3), array(4,4), array(3,0), array(4,-4), array(0,-3), array(-4,-4), array(-3,0), array(-4,4), //array(0,3), ); var_dump(getCenter($polygon));
Result:
array(2) {
[0]=>
int(0)
[1]=>
int(0)
}