Geo-MedianCenter-XS
view release on metacpan or search on metacpan
double dst = haversine_distance_rad(clat, clon, lat, lon);
double wgd;
if (dst == 0) {
dst = DBL_EPSILON;
}
wgd = wgt / dst;
sumkx += wgd * data[ix++];
sumky += wgd * data[ix++];
sumkz += wgd * data[ix++];
sumk += wgd;
}
avgx = sumkx / sumk;
avgy = sumky / sumk;
avgz = sumkz / sumk;
/* Should this rather use asin(avgz)? */
nlat = atan2(avgz, sqrt(avgx * avgx + avgy * avgy));
nlon = atan2(avgy, avgx);
ndst = haversine_distance_rad(clat, clon, nlat, nlon);
if (!(max_iterations-- > 0) || (ndst <= tolerance)) {
*plat = nlat * (180.0 / PI);
*plon = nlon * (180.0 / PI);
Safefree(data);
return 0;
}
clat = nlat;
clon = nlon;
}
/* If we get here, there was an error retrieving the points */
return -1;
}
MODULE = Geo::MedianCenter::XS PACKAGE = Geo::MedianCenter::XS
PROTOTYPES: DISABLE
double
haversine_distance_rad(double lat1, double lon1, double lat2, double lon2)
double
haversine_distance_dec(double lat1, double lon1, double lat2, double lon2)
void
median_center(opts)
HV* opts;
PREINIT:
double lat = 0.0f;
double lon = 0.0f;
PPCODE:
if (median_center(opts, &lat, &lon))
XSRETURN_EMPTY;
mXPUSHs(newSVnv( lat ));
mXPUSHs(newSVnv( lon ));
( run in 0.658 second using v1.01-cache-2.11-cpan-5511b514fd6 )