26 template<
class G>
void
27 compute(
double a,
double f, mwSize
m,
const double* latlong,
28 double* geodesic,
double* aux) {
29 const double* lat1 = latlong;
30 const double* lon1 = latlong +
m;
31 const double* lat2 = latlong + 2*
m;
32 const double* lon2 = latlong + 3*
m;
33 double* azi1 = geodesic;
34 double* azi2 = geodesic +
m;
35 double* s12 = geodesic + 2*
m;
50 for (mwIndex
i = 0;
i <
m; ++
i) {
51 if (
abs(lat1[
i]) <= 90 && lon1[
i] >= -540 && lon1[
i] < 540 &&
52 abs(lat2[
i]) <= 90 && lon2[
i] >= -540 && lon2[
i] < 540) {
54 a12[
i] =
g.Inverse(lat1[
i], lon1[
i], lat2[
i], lon2[
i],
55 s12[
i], azi1[
i], azi2[
i],
56 m12[
i], M12[
i], M21[
i], S12[
i]);
58 g.Inverse(lat1[
i], lon1[
i], lat2[
i], lon2[
i],
59 s12[
i], azi1[
i], azi2[
i]);
65 int nrhs,
const mxArray* prhs[] ) {
68 mexErrMsgTxt(
"One input argument required.");
70 mexErrMsgTxt(
"More than three input arguments specified.");
72 mexErrMsgTxt(
"Must specify flattening with the equatorial radius.");
74 mexErrMsgTxt(
"More than two output arguments specified.");
76 if (!( mxIsDouble(prhs[0]) && !mxIsComplex(prhs[0]) ))
77 mexErrMsgTxt(
"latlong coordinates are not of type double.");
79 if (mxGetN(prhs[0]) != 4)
80 mexErrMsgTxt(
"latlong coordinates must be M x 4 matrix.");
82 double a = Constants::WGS84_a<double>(),
f = Constants::WGS84_f<double>();
84 if (!( mxIsDouble(prhs[1]) && !mxIsComplex(prhs[1]) &&
85 mxGetNumberOfElements(prhs[1]) == 1 ))
86 mexErrMsgTxt(
"Equatorial radius is not a real scalar.");
87 a = mxGetScalar(prhs[1]);
88 if (!( mxIsDouble(prhs[2]) && !mxIsComplex(prhs[2]) &&
89 mxGetNumberOfElements(prhs[2]) == 1 ))
90 mexErrMsgTxt(
"Flattening is not a real scalar.");
91 f = mxGetScalar(prhs[2]);
94 mwSize
m = mxGetM(prhs[0]);
96 const double* latlong = mxGetPr(prhs[0]);
98 double* geodesic = mxGetPr(plhs[0] = mxCreateDoubleMatrix(
m, 3, mxREAL));
99 std::fill(geodesic, geodesic + 3*
m, Math::NaN<double>());
102 nlhs == 2 ? mxGetPr(plhs[1] = mxCreateDoubleMatrix(
m, 5, mxREAL)) :
105 std::fill(aux, aux + 5*
m, Math::NaN<double>());
109 compute<Geodesic>(
a,
f,
m, latlong, geodesic, aux);
111 compute<GeodesicExact>(
a,
f,
m, latlong, geodesic, aux);
113 catch (
const std::exception&
e) {
114 mexErrMsgTxt(
e.what());