Skip to content

Instantly share code, notes, and snippets.

@acidjazz
Created February 28, 2019 01:33
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save acidjazz/ff3035924a79ae7dd393b281690ed141 to your computer and use it in GitHub Desktop.
Save acidjazz/ff3035924a79ae7dd393b281690ed141 to your computer and use it in GitHub Desktop.
<?php
*/
function generate_random_point( $centre, $radius ){
$radius_earth = 3959; //miles
// pick random distance within $distance;
$distance = lcg_value()*$radius;
// convert degrees to radians.
$centre_rads = array_map( 'deg2rad', $centre );
// first suppose our point is the north pole.
// find a random point $distance miles away
$lat_rads = (pi()/2) - $distance/$radius_earth;
$lng_rads = lcg_value()*2*pi();
// ($lat_rads,$lng_rads) is a point on the circle which is
// $distance miles from the north pole. Convert to Cartesian
$x1 = cos( $lat_rads ) * sin( $lng_rads );
$y1 = cos( $lat_rads ) * cos( $lng_rads );
$z1 = sin( $lat_rads );
// rotate that sphere so that the north pole is now at $centre.
// rotate in x axis by $rot = (pi()/2) - $centre_rads[0];
$rot = (pi()/2) - $centre_rads[0];
$x2 = $x1;
$y2 = $y1 * cos( $rot ) + $z1 * sin( $rot );
$z2 = -$y1 * sin( $rot ) + $z1 * cos( $rot );
// rotate in z axis by $rot = $centre_rads[1]
$rot = $centre_rads[1];
$x3 = $x2 * cos( $rot ) + $y2 * sin( $rot );
$y3 = -$x2 * sin( $rot ) + $y2 * cos( $rot );
$z3 = $z2;
// finally convert this point to polar co-ords
$lng_rads = atan2( $x3, $y3 );
$lat_rads = asin( $z3 );
return array_map( 'rad2deg', [ $lat_rads, $lng_rads ] );
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment