PHP で、多角形(ポリゴン)の重心(中心)を求める。

多角形、たとえば四角形^^; (x1, y1) ... (x4, y4) の中心を求める。正確には、多角形の重心の座標を求める。

データとしては 4つの座標データがセミコロン(;)で区切られている、

$data = '242.18,525.87;243.16,581.93;294.83,580.61;294.00,525.50;';

みたいな初期データを考える(それぞれの x1, y1 の座標はさらにカンマで区切られている)。

で、多角形の中心点の座標の求め方 (https://okwave.jp/qa2534558.html) で議論されている内容を PHP 化すると、以下のようになると思う(本当にいいのだろうか?)。

<?php $data = '242.18,525.87;243.16,581.93;294.83,580.61;294.00,525.50;'; $set = explode(';', $data); $x = array(); $y = array(); $S = 0; $X = 0; $Y = 0; $count = count($set) - 1; $set[$count] = $set[0]; print_r($set); for($i = 0; $i <= $count; $i++) { list($x[$i], $y[$i]) = explode(',', $set[$i]); } for($i = 0; $i < $count; $i++) { $S += $x[$i] * $y[$i+1] - $x[$i+1] * $y[$i]; } $S /= 2; for($i = 0; $i < $count; $i++) { $X += ($x[$i] + $x[$i+1]) * ($x[$i] * $y[$i+1] - $x[$i+1] * $y[$i]); $Y += ($y[$i] + $y[$i+1]) * ($x[$i] * $y[$i+1] - $x[$i+1] * $y[$i]); } $X *= 1 / (6 * $S); $Y *= 1 / (6 * $S); print "$X, $Y\n"; ?>