Geo-Index
view release on metacpan or search on metacpan
/* Functions using doubles */
double d_diameter, d_lat_1, d_lon_1;
double d_cos_lat_1;
void SetUpDistance_double(double new_diameter, double new_lat_1, double new_lon_1) {
d_diameter = new_diameter;
d_lat_1 = new_lat_1;
d_lon_1 = new_lon_1;
d_cos_lat_1 = cos( new_lat_1 );
}
double HaversineDistance_double(double lat_0, double lon_0) {
double sin_lat_diff_over_2 = sin( ( lat_0 - d_lat_1 ) / 2.0 );
double sin_lon_diff_over_2 = sin( ( lon_0 - d_lon_1 ) / 2.0 );
double n = ( sin_lat_diff_over_2 * sin_lat_diff_over_2 )
+ (
( sin_lon_diff_over_2 * sin_lon_diff_over_2 )
* d_cos_lat_1
* cos( lat_0 )
);
/* The haversine formula may get messy around antipodal points so clip to the largest sane value. */
if ( n < 0.0 ) { n = 0.0; }
return d_diameter * asin( sqrt(n) );
}
/* End of C code */
MODULE = Geo::Index PACKAGE = Geo::Index
PROTOTYPES: DISABLE
unsigned int
GetCCodeVersion ()
unsigned int
fast_log2_double (n)
double n
unsigned int
fast_log2_float (n)
float n
void
ComputeAreaExtrema_float (tile_adjust, max_size, max_level, p_lat, p_lat_rad, p_lon, polar_circumference, search_radius)
int tile_adjust
unsigned long max_size
unsigned int max_level
float p_lat
float p_lat_rad
float p_lon
float polar_circumference
float search_radius
PREINIT:
I32* temp;
PPCODE:
temp = PL_markstack_ptr++;
ComputeAreaExtrema_float(tile_adjust, max_size, max_level, p_lat, p_lat_rad, p_lon, polar_circumference, search_radius);
if (PL_markstack_ptr != temp) {
/* truly void, because dXSARGS not invoked */
PL_markstack_ptr = temp;
XSRETURN_EMPTY; /* return empty stack */
}
/* must have used dXSARGS; list context implied */
return; /* assume stack size is correct */
void
ComputeAreaExtrema_double (tile_adjust, max_size, max_level, p_lat, p_lat_rad, p_lon, polar_circumference, search_radius)
int tile_adjust
unsigned long max_size
unsigned int max_level
double p_lat
double p_lat_rad
double p_lon
double polar_circumference
double search_radius
PREINIT:
I32* temp;
PPCODE:
temp = PL_markstack_ptr++;
ComputeAreaExtrema_double(tile_adjust, max_size, max_level, p_lat, p_lat_rad, p_lon, polar_circumference, search_radius);
if (PL_markstack_ptr != temp) {
/* truly void, because dXSARGS not invoked */
PL_markstack_ptr = temp;
XSRETURN_EMPTY; /* return empty stack */
}
/* must have used dXSARGS; list context implied */
return; /* assume stack size is correct */
void
SetUpDistance_float (new_diameter, new_lat_1, new_lon_1)
float new_diameter
float new_lat_1
float new_lon_1
PREINIT:
I32* temp;
PPCODE:
temp = PL_markstack_ptr++;
SetUpDistance_float(new_diameter, new_lat_1, new_lon_1);
if (PL_markstack_ptr != temp) {
/* truly void, because dXSARGS not invoked */
PL_markstack_ptr = temp;
XSRETURN_EMPTY; /* return empty stack */
}
/* must have used dXSARGS; list context implied */
return; /* assume stack size is correct */
float
HaversineDistance_float (lat_0, lon_0)
float lat_0
float lon_0
void
SetUpDistance_double (new_diameter, new_lat_1, new_lon_1)
double new_diameter
double new_lat_1
double new_lon_1
PREINIT:
I32* temp;
PPCODE:
temp = PL_markstack_ptr++;
SetUpDistance_double(new_diameter, new_lat_1, new_lon_1);
if (PL_markstack_ptr != temp) {
/* truly void, because dXSARGS not invoked */
PL_markstack_ptr = temp;
XSRETURN_EMPTY; /* return empty stack */
}
/* must have used dXSARGS; list context implied */
return; /* assume stack size is correct */
double
HaversineDistance_double (lat_0, lon_0)
double lat_0
double lon_0
( run in 0.460 second using v1.01-cache-2.11-cpan-5511b514fd6 )