GeographicLib: PolygonArea.cpp Source File (original) (raw)

1

2

3

4

5

6

7

8

9

11

13

14 using namespace std;

15

16 template

17 int PolygonAreaT::transit(real lon1, real lon2) {

18

19

20

21

22

26

27 return

28

29 lon12 > 0 && ((lon1 < 0 && lon2 >= 0) ||

30

31 (lon1 > 0 && lon2 == 0)) ? 1 :

32

33 (lon12 < 0 && lon1 >= 0 && lon2 < 0 ? -1 : 0);

34

35

36

37

38

39

40 }

41

42

43

44 template

45 int PolygonAreaT::transitdirect(real lon1, real lon2) {

46

47

48

49

50

51

52

53

54

55

56

59 return ( (lon2 >= 0 && lon2 < Math::td ? 0 : 1) -

60 (lon1 >= 0 && lon1 < Math::td ? 0 : 1) );

61 }

62

63 template

65 if (_num == 0) {

66 _lat0 = _lat1 = lat;

67 _lon0 = _lon1 = lon;

68 } else {

69 real s12, S12, t;

70 _earth.GenInverse(_lat1, _lon1, lat, lon, _mask,

71 s12, t, t, t, t, t, S12);

72 _perimetersum += s12;

73 if (!_polyline) {

74 _areasum += S12;

75 _crossings += transit(_lon1, lon);

76 }

77 _lat1 = lat; _lon1 = lon;

78 }

79 ++_num;

80 }

81

82 template

84 if (_num) {

85 real lat, lon, S12, t;

86 _earth.GenDirect(_lat1, _lon1, azi, false, s, _mask,

87 lat, lon, t, t, t, t, t, S12);

88 _perimetersum += s;

89 if (!_polyline) {

90 _areasum += S12;

91 _crossings += transitdirect(_lon1, lon);

92 }

93 _lat1 = lat; _lon1 = lon;

94 ++_num;

95 }

96 }

97

98 template

100 real& perimeter, real& area) const

101 {

102 real s12, S12, t;

103 if (_num < 2) {

104 perimeter = 0;

105 if (!_polyline)

106 area = 0;

107 return _num;

108 }

109 if (_polyline) {

110 perimeter = _perimetersum();

111 return _num;

112 }

113 _earth.GenInverse(_lat1, _lon1, _lat0, _lon0, _mask,

114 s12, t, t, t, t, t, S12);

115 perimeter = _perimetersum(s12);

117 tempsum += S12;

118 int crossings = _crossings + transit(_lon1, _lon0);

119 AreaReduce(tempsum, crossings, reverse, sign);

120 area = real(0) + tempsum();

121 return _num;

122 }

123

124 template

126 bool reverse, bool sign,

127 real& perimeter, real& area) const

128 {

129 if (_num == 0) {

130 perimeter = 0;

131 if (!_polyline)

132 area = 0;

133 return 1;

134 }

135 perimeter = _perimetersum();

136 real tempsum = _polyline ? 0 : _areasum();

137 int crossings = _crossings;

138 unsigned num = _num + 1;

139 for (int i = 0; i < (_polyline ? 1 : 2); ++i) {

140 real s12, S12, t;

141 _earth.GenInverse(i == 0 ? _lat1 : lat, i == 0 ? _lon1 : lon,

142 i != 0 ? _lat0 : lat, i != 0 ? _lon0 : lon,

143 _mask, s12, t, t, t, t, t, S12);

144 perimeter += s12;

145 if (!_polyline) {

146 tempsum += S12;

147 crossings += transit(i == 0 ? _lon1 : lon,

148 i != 0 ? _lon0 : lon);

149 }

150 }

151

152 if (_polyline)

153 return num;

154

155 AreaReduce(tempsum, crossings, reverse, sign);

156 area = real(0) + tempsum;

157 return num;

158 }

159

160 template

162 bool reverse, bool sign,

163 real& perimeter, real& area) const

164 {

165 if (_num == 0) {

167 if (!_polyline)

169 return 0;

170 }

171 unsigned num = _num + 1;

172 perimeter = _perimetersum() + s;

173 if (_polyline)

174 return num;

175

176 real tempsum = _areasum();

177 int crossings = _crossings;

178 {

179 real lat, lon, s12, S12, t;

180 _earth.GenDirect(_lat1, _lon1, azi, false, s, _mask,

181 lat, lon, t, t, t, t, t, S12);

182 tempsum += S12;

183 crossings += transitdirect(_lon1, lon);

184 _earth.GenInverse(lat, lon, _lat0, _lon0, _mask,

185 s12, t, t, t, t, t, S12);

186 perimeter += s12;

187 tempsum += S12;

188 crossings += transit(lon, _lon0);

189 }

190

191 AreaReduce(tempsum, crossings, reverse, sign);

192 area = real(0) + tempsum;

193 return num;

194 }

195

196 template

197 template

199 bool reverse, bool sign) const {

200 Remainder(area);

201 if (crossings & 1) area += (area < 0 ? 1 : -1) * _area0/2;

202

203

204 if (!reverse) area *= -1;

205

206 if (sign) {

207 if (area > _area0/2)

208 area -= _area0;

209 else if (area <= -_area0/2)

210 area += _area0;

211 } else {

212 if (area >= _area0)

213 area -= _area0;

214 else if (area < 0)

215 area += _area0;

216 }

217 }

218

222

223}

#define GEOGRAPHICLIB_EXPORT

GeographicLib::Math::real real

Header for GeographicLib::PolygonAreaT class.

static T AngNormalize(T x)

static constexpr int td

degrees per turn

static T AngDiff(T x, T y, T &e)

void AddPoint(real lat, real lon)

Definition PolygonArea.cpp:64

unsigned Compute(bool reverse, bool sign, real &perimeter, real &area) const

Definition PolygonArea.cpp:99

unsigned TestPoint(real lat, real lon, bool reverse, bool sign, real &perimeter, real &area) const

Definition PolygonArea.cpp:125

void AddEdge(real azi, real s)

Definition PolygonArea.cpp:83

unsigned TestEdge(real azi, real s, bool reverse, bool sign, real &perimeter, real &area) const

Definition PolygonArea.cpp:161

Namespace for GeographicLib.