
PHP で使う機会は余りありませんが、たまたま多角形の重心点を計算する必要があったので、下記サイトを参考にして PHP で書き換えてみました。
参考
http://homepage2.nifty.com/gis_yasu21/sub1.htm(リンク切れ)
<?php
// 頂点を右回りに記述 (x, y)
$vertexes = array(
array(0, 0),
array(10, 80),
array(100, 100),
array(120, 30)
);
$n = count($vertexes);
$area = 0;
$gx = 0;
$gy = 0;
for($i=0;$i<$n;$i++){
$pt1 = $vertexes[$i];
$pt2 = ($i + 1 >= $n) ? $vertexes[0] : $vertexes[$i + 1];
$area = $area + ($pt2[0] - $pt1[0]) * ($pt2[1] + $pt1[1]);
$gx = $gx + ((pow($pt2[0], 3) - pow($pt1[0], 3)) * ($pt2[1] - $pt1[1]) / 3
+ (pow($pt2[0], 2) - pow($pt1[0], 2)) * ($pt2[0] * $pt1[1] - $pt1[0] * $pt2[1]) / 2)
/ ($pt2[0] - $pt1[0]);
$gy = $gy + ((pow($pt2[1], 3) - pow($pt1[1], 3)) * ($pt2[0] - $pt1[0]) / 3
+ (pow($pt2[1], 2) - pow($pt1[1], 2)) * ($pt1[0] * $pt2[1] - $pt2[0] * $pt1[1]) / 2)
/ ($pt2[1] - $pt1[1]);
}
$area = abs($area * 0.5); // 面積
$gx = $gx / $area; // 重心x座標
$gy = -$gy / $area; // 重心のy座標
Similar Posts:
- [PHP]マジックメソッドを使ったアクセサ(__get, __set)
- [PHP]ページごとの訪問者数を調べるアクセスカウンター
- [PHP]ライフゲームを作る
- [PHP]文字の種類ごとに最低1つ以上使ったランダム文字列
- [PHP]レーダーチャート(クモの巣グラフ)をGDで描画する
- [HTML, CSS]CSSのクラスやIDの命名規則とよく使われる名前
- [PHP]画像を連結して数値を表示する
- [PHP]10進数を任意の文字を使って62進数などのn進数に相互変換する(基数変換)