sub make_quick_reject { # Args: lat (radians), long (radians), dist my(\$lat,\$long,\$dist) = @_; my(\$maxlatdiff) = \$dist / EARTH_RADIUS; if (abs(\$lat) + \$maxlatdiff > PI/2) { # special case - near poles return sub { abs(\$lat - \$_[0]) > \$maxlatdiff; }; } my(\$longmult); \$longmult = 1 / cos(abs(\$lat) + \$maxlatdiff); my(\$maxlongdiff) = \$maxlatdiff * \$longmult; return sub { abs(\$lat - \$_[0]) > \$maxlatdiff or ( abs(\$long - \$_[1]) > \$maxlongdiff and abs(\$long - \$_[1]) < 2*PI - \$maxlongdiff ); }; } sub make_quick_accept { # Args: lat (radians), long (radians), dist my(\$lat,\$long,\$dist) = @_; my(\$maxlatdiff) = \$dist / EARTH_RADIUS; \$maxlatdiff /= sqrt(2); my(\$longmult); if (abs(\$lat) < \$maxlatdiff ) { # special case - near equator \$longmult = 1; } else { \$longmult = 1 / cos(abs(\$lat) - \$maxlatdiff); } my(\$maxlongdiff) = \$maxlatdiff * \$longmult; return sub { abs(\$lat - \$_[0]) < \$maxlatdiff and ( abs(\$long - \$_[1]) < \$maxlongdiff or abs(\$long - \$_[1]) > 2*PI - \$maxlongdiff ); }; }