12 namespace GeographicLib {
16 template <
class GeodType>
24 _earth.GenInverse(_lat1, _lon1, lat, lon, _mask, s12, t, t, t, t, t, S12);
28 _crossings += transit(_lon1, lon);
30 _lat1 = lat; _lon1 = lon;
35 template <
class GeodType>
38 real lat, lon, S12, t;
39 _earth.GenDirect(_lat1, _lon1, azi,
false, s, _mask,
40 lat, lon, t, t, t, t, t, S12);
44 _crossings += transit(_lon1, lon);
46 _lat1 = lat; _lon1 = lon;
51 template <
class GeodType>
53 real& perimeter, real& area)
const {
62 perimeter = _perimetersum();
65 _earth.GenInverse(_lat1, _lon1, _lat0, _lon0, _mask,
66 s12, t, t, t, t, t, S12);
67 perimeter = _perimetersum(s12);
70 int crossings = _crossings + transit(_lon1, _lon0);
72 tempsum += (tempsum < 0 ? 1 : -1) * _area0/2;
79 if (tempsum > _area0/2)
81 else if (tempsum <= -_area0/2)
84 if (tempsum >= _area0)
93 template <
class GeodType>
95 bool reverse,
bool sign,
96 real& perimeter, real& area)
const
104 perimeter = _perimetersum();
105 real tempsum = _polyline ? 0 : _areasum();
106 int crossings = _crossings;
107 unsigned num = _num + 1;
108 for (
int i = 0; i < (_polyline ? 1 : 2); ++i) {
110 _earth.GenInverse(i == 0 ? _lat1 : lat, i == 0 ? _lon1 : lon,
111 i != 0 ? _lat0 : lat, i != 0 ? _lon0 : lon,
112 _mask, s12, t, t, t, t, t, S12);
116 crossings += transit(i == 0 ? _lon1 : lon,
117 i != 0 ? _lon0 : lon);
125 tempsum += (tempsum < 0 ? 1 : -1) * _area0/2;
132 if (tempsum > _area0/2)
134 else if (tempsum <= -_area0/2)
137 if (tempsum >= _area0)
139 else if (tempsum < 0)
146 template <
class GeodType>
148 bool reverse,
bool sign,
149 real& perimeter, real& area)
const {
156 unsigned num = _num + 1;
157 perimeter = _perimetersum() + s;
161 real tempsum = _areasum();
162 int crossings = _crossings;
164 real lat, lon, s12, S12, t;
165 _earth.GenDirect(_lat1, _lon1, azi,
false, s, _mask,
166 lat, lon, t, t, t, t, t, S12);
168 crossings += transit(_lon1, lon);
169 _earth.GenInverse(lat, lon, _lat0, _lon0, _mask, s12, t, t, t, t, t, S12);
172 crossings += transit(lon, _lon0);
176 tempsum += (tempsum < 0 ? 1 : -1) * _area0/2;
183 if (tempsum > _area0/2)
185 else if (tempsum <= -_area0/2)
188 if (tempsum >= _area0)
190 else if (tempsum < 0)