[PHP]多角形の重心の座標や面積を計算する

Pocket

polygon

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:




コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です