Geo-MedianCenter-XS

 view release on metacpan or  search on metacpan

XS.xs  view on Meta::CPAN

      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 )