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";

?>
トラックバック URL: https://perltips.twinkle.cc/trackback/242
Posted on 2007-09-09 by yas |