[ create a new paste ] login | about

Link: http://codepad.org/MMS0bOeq    [ raw code | output | fork ]

PHP, pasted on Jun 25:
function halfMassRadius($coordinateArr) {

	// tuning
	$deltar = 0.1;
	$massRatio = 0.2;

	// init
	$halfRMin = null;
	$centroidKey = null;

	foreach ($coordinateArr as $i => $c) {
		$radius = 0;

		$stayHere = true;
		while ($stayHere) {
			$radius = $radius + $deltar;
			$nInside = count(getCoordinatesWithinRadius($coordinateArr,$c,$radius));
			if ($nInside >= count($coordinateArr)*$massRatio) {
				if (is_null($halfRMin) || $radius < $halfRMin) {
					$halfRMin = $radius;
					$centroidKey = $i;
				}
				$stayHere = false;
			}
		}
	}
	return $coordinateArr[$centroidKey][0] . ',' . $coordinateArr[$centroidKey][0];

}

function getCoordinatesWithinRadius ($coordinateArray, $center, $radius) {
	$resultArray= array();
	$lat1 = $center[0];
	$long1 = $center[1];
	foreach ($coordinateArray as $coordinate) {
		$lat2 = $coordinate[0];
		$long2 = $coordinate[1];
		$distance = 3959 * acos(cos(radians($lat1)) * cos(radians($lat2)) * cos(radians($long2) - radians($long2)) + sin(radians($lat1)) * sin(radians($lat2)));
		if ($distance < $radius) $resultArray[] = $coordinate;
	}
	return $resultArray;  
}

function radians($deg) {
	return $deg * M_PI / 180;
}


Output:
function halfMassRadius($coordinateArr) {

	// tuning
	$deltar = 0.1;
	$massRatio = 0.2;

	// init
	$halfRMin = null;
	$centroidKey = null;

	foreach ($coordinateArr as $i => $c) {
		$radius = 0;

		$stayHere = true;
		while ($stayHere) {
			$radius = $radius + $deltar;
			$nInside = count(getCoordinatesWithinRadius($coordinateArr,$c,$radius));
			if ($nInside >= count($coordinateArr)*$massRatio) {
				if (is_null($halfRMin) || $radius < $halfRMin) {
					$halfRMin = $radius;
					$centroidKey = $i;
				}
				$stayHere = false;
			}
		}
	}
	return $coordinateArr[$centroidKey][0] . ',' . $coordinateArr[$centroidKey][0];

}

function getCoordinatesWithinRadius ($coordinateArray, $center, $radius) {
	$resultArray= array();
	$lat1 = $center[0];
	$long1 = $center[1];
	foreach ($coordinateArray as $coordinate) {
		$lat2 = $coordinate[0];
		$long2 = $coordinate[1];
		$distance = 3959 * acos(cos(radians($lat1)) * cos(radians($lat2)) * cos(radians($long2) - radians($long2)) + sin(radians($lat1)) * sin(radians($lat2)));
		if ($distance < $radius) $resultArray[] = $coordinate;
	}
	return $resultArray;  
}

function radians($deg) {
	return $deg * M_PI / 180;
}


Create a new paste based on this one


Comments: