16 template <
class GeodType>
25 _earth.GenInverse(_lat1, _lon1, lat, lon, _mask,
26 s12, t, t, t, t, t, S12);
30 _crossings += transit(_lon1, lon);
32 _lat1 = lat; _lon1 = lon;
37 template <
class GeodType>
40 real lat, lon, S12, t;
41 _earth.GenDirect(_lat1, _lon1, azi,
false, s, _mask,
42 lat, lon, t, t, t, t, t, S12);
46 _crossings += transitdirect(_lon1, lon);
49 _lat1 = lat; _lon1 = lon;
54 template <
class GeodType>
56 real& perimeter, real& area)
const
66 perimeter = _perimetersum();
69 _earth.GenInverse(_lat1, _lon1, _lat0, _lon0, _mask,
70 s12, t, t, t, t, t, S12);
71 perimeter = _perimetersum(s12);
74 int crossings = _crossings + transit(_lon1, _lon0);
75 AreaReduce(tempsum, crossings, reverse, sign);
80 template <
class GeodType>
82 bool reverse,
bool sign,
83 real& perimeter, real& area)
const
91 perimeter = _perimetersum();
92 real tempsum = _polyline ? 0 : _areasum();
93 int crossings = _crossings;
94 unsigned num = _num + 1;
95 for (
int i = 0; i < (_polyline ? 1 : 2); ++i) {
97 _earth.GenInverse(i == 0 ? _lat1 : lat, i == 0 ? _lon1 : lon,
98 i != 0 ? _lat0 : lat, i != 0 ? _lon0 : lon,
99 _mask, s12, t, t, t, t, t, S12);
103 crossings += transit(i == 0 ? _lon1 : lon,
104 i != 0 ? _lon0 : lon);
111 AreaReduce(tempsum, crossings, reverse, sign);
116 template <
class GeodType>
118 bool reverse,
bool sign,
119 real& perimeter, real& area)
const
127 unsigned num = _num + 1;
128 perimeter = _perimetersum() + s;
132 real tempsum = _areasum();
133 int crossings = _crossings;
135 real lat, lon, s12, S12, t;
136 _earth.GenDirect(_lat1, _lon1, azi,
false, s, _mask,
137 lat, lon, t, t, t, t, t, S12);
139 crossings += transitdirect(_lon1, lon);
141 _earth.GenInverse(lat, lon, _lat0, _lon0, _mask,
142 s12, t, t, t, t, t, S12);
145 crossings += transit(lon, _lon0);
148 AreaReduce(tempsum, crossings, reverse, sign);
153 template <
class GeodType>
154 template <
typename T>
158 if (crossings & 1) area += (area < 0 ? 1 : -1) * _area0/2;
161 if (!reverse) area *= -1;
166 else if (area <= -_area0/2)