-
Notifications
You must be signed in to change notification settings - Fork 0
/
Multitude.h
200 lines (168 loc) · 16.1 KB
/
Multitude.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
//----------------------------------------------------------------------------//
// *** БИБЛИОТЕКА ЛОГИЧЕСКИХ МАНИПУЛЯЦИЙ НАД МНОЖЕСТВАМИ *** //
// //
// Файл Multitude.h //
// //
// Множества интерпретируются как контуры на поверхности Земли (в геодезичес- //
// ких координатах) //
// //
// Автор ГЛУЩЕНКО Сергей //
// //
// Москва //
//----------------------------------------------------------------------------//
#ifndef MultitudeH
#define MultitudeH
#ifdef _MSC_VER
#define _USE_MATH_DEFINES
#endif
#include <math.h>
#include "Clipper.h"
#include "../QuatVectMatr/GeneralLib.h"
class TMultitude
{
public:
//Тип описывает геодезическую точку
struct OnePoint
{
OnePoint() : B(0.0), L(0.0) {}
double B; //Геодезическая широта
double L; //Геодезическая долгота
};
typedef struct OnePoint TOnePoint;
//Тип описывает контур (пятно) на поверхности Земли
typedef std::vector<TOnePoint> TSpot;
//Тип описывает массив контуров (пятен) на поверхности Земли
struct OneSpot
{
TSpot spot;
};
typedef std::vector<struct OneSpot> TArraySpot;
private:
int CONST_SCALE;
bool priznak;
ClipperLib::Paths FFirstPolygons;
ClipperLib::Paths FSecondPolygons;
ClipperLib::Paths FResultPolygons;
TSpot FA;
TArraySpot FB;
//Копирует входные массивы внутрь класса, чтобы их не испортить
void CopyData(TSpot A, TArraySpot B);
//Вызывает сервис библиотеки Clipper для расчета
void Execute(ClipperLib::ClipType clipType, ClipperLib::PolyFillType subjFillType, ClipperLib::PolyFillType clipFillType);
//Служебная функция, вызываемая из метода PointInAnyPolygon
double AngleBetweenVectors(TVector vA, TVector vB);
//Проверяет точку на принадлежность внутренней области ЛЮБОГО многоугольника. True - внутри многоугольника.
// Единственное ограничение - многоугольник должен быть без взаимных пересечений !!!
// Граница многоугольника принадлежит самому многоугольнику, т.е. точка на границе считается
// расположенной внутри многоугольника.
// Функция предназначена для ДЕКАРТОВЫХ координат и она никакого отношения к геодезическим широтам и долготам не имеет
// На вход подаются:
// - двумерные координаты точки;
// - массив двумерных координат точек вершин многоугольника (первая и последняя вершины должны совпадать,
// накладывающихся одна на другую вершин не должно быть).
bool PointInAnyPolygon(TOnePoint Point, TSpot Spot);
public:
TMultitude(void);
virtual ~TMultitude(void);
//Из множества A вычитает несколько множеств B (A\B)
// Широта и долгота подаются на вход в радианах.
// Диапазон изменения подаваемой на вход широты [-pi/2; +pi/2]
// Диапазон изменения подаваемой на вход долготы может быть либо [0; +2*pi), либо [-pi; +pi]
// Результат возвращается также в радианах, но долгота возвращается только в пределах [0; +2*pi)
TArraySpot AMinusB(TSpot A, TArraySpot B);
//К множеству A прибавляет несколько множеств B (AuB объединение множеств)
// Широта и долгота подаются на вход в радианах.
// Диапазон изменения подаваемой на вход широты [-pi/2; +pi/2]
// Диапазон изменения подаваемой на вход долготы может быть либо [0; +2*pi), либо [-pi; +pi]
// Результат возвращается также в радианах, но долгота возвращается только в пределах [0; +2*pi)
TArraySpot APlusB(TSpot A, TArraySpot B);
//Возвращает пересечение множества A с хотя бы одним множеством из B (AпB)
// Широта и долгота подаются на вход в радианах.
// Диапазон изменения подаваемой на вход широты [-pi/2; +pi/2]
// Диапазон изменения подаваемой на вход долготы может быть либо [0; +2*pi), либо [-pi; +pi]
// Результат возвращается также в радианах, но долгота возвращается только в пределах [0; +2*pi)
TArraySpot AIntersectionB(TSpot A, TArraySpot B);
//Объединяет множества A и B, затем из результата вычитает пересечение множества A с хотя бы
// одним множеством из B ( (AuB)\(AпB) )
// Широта и долгота подаются на вход в радианах.
// Диапазон изменения подаваемой на вход широты [-pi/2; +pi/2]
// Диапазон изменения подаваемой на вход долготы может быть либо [0; +2*pi), либо [-pi; +pi]
// Результат возвращается также в радианах, но долгота возвращается только в пределах [0; +2*pi)
TArraySpot AXorB(TSpot A, TArraySpot B);
//Отвечает на вопрос: "Множество B полностью входит во множество A?"
// Ограничение по использованию метода: каждое из множеств A и B не должно иметь самопересечений (песочные
// часы не допускаются)
// Широта и долгота подаются на вход в радианах.
// Диапазон изменения подаваемой на вход широты [-pi/2; +pi/2]
// Диапазон изменения подаваемой на вход долготы может быть либо [0; +2*pi), либо [-pi; +pi]
// Возвращаемые значения:
// 0 - B целиком лежит вне множества A;
// 1 - B входит в A целиком;
// 2 - B пересекает множество A (часть B лежит внутри A, часть B лежит вне множества A)
int AHoldB(TSpot A, TSpot B);
//Виртуально "делит" множество A по долготе пополам и возвращает эту долготу. Само множество A не меняется
// Широта и долгота подаются на вход в радианах.
// Диапазон изменения подаваемой на вход широты [-pi/2; +pi/2]
// Диапазон изменения подаваемой на вход долготы может быть либо [0; +2*pi), либо [-pi; +pi]
// Результат возвращается также в радианах, но долгота возвращается только в пределах [0; +2*pi)
double MiddleL(TSpot A);
//Делит множество A по указанной пользователем долготе на части (производит разрезание множества).
// Если долгота разреза указана неверно, тогда разрезания не производится, а возвращается исходное множество.
// В результате успешного разрезания могут получиться два и более множеств
// Широта и долгота подаются на вход в радианах.
// Диапазон изменения подаваемой на вход широты [-pi/2; +pi/2]
// Диапазон изменения подаваемой на вход долготы может быть либо [0; +2*pi), либо [-pi; +pi]
// Результат возвращается также в радианах, но долгота возвращается только в пределах [0; +2*pi)
TArraySpot DivideA(double L, TSpot A);
//Из множества A вычитает множество B, при этом результирующие множества являются простыми полигонами (не имеют
// дырок и каждый состоит из одного контура). Задача применяется для изменения площадного объекта наблюдения
// в процессе покрытия его сканами
// Широта и долгота подаются на вход в радианах.
// Диапазон изменения подаваемой на вход широты [-pi/2; +pi/2]
// Диапазон изменения подаваемой на вход долготы может быть либо [0; +2*pi), либо [-pi; +pi]
// Результат возвращается также в радианах, но долгота возвращается только в пределах [0; +2*pi)
TArraySpot AMinusBSimpleResult(TSpot A, TSpot B);
//Из нескольких никак не связанных друг с другом множеств A вычитает множество B, при этом результирующие множества
// являются простыми полигонами (не имеют дырок и каждый состоит из одного контура). Задача применяется для
// изменения площадного объекта наблюдения в процессе покрытия его сканами
// Широта и долгота подаются на вход в радианах.
// Диапазон изменения подаваемой на вход широты [-pi/2; +pi/2]
// Диапазон изменения подаваемой на вход долготы может быть либо [0; +2*pi), либо [-pi; +pi]
// Результат возвращается также в радианах, но долгота возвращается только в пределах [0; +2*pi)
TArraySpot AMinusBSimpleResult(TArraySpot A, TSpot B);
//Из множества A вычитает несколько множеств B, при этом результирующие множества являются простыми полигонами (не имеют
// дырок и каждый состоит из одного контура). Задача применяется для изменения площадного объекта наблюдения
// в процессе покрытия его сканами
// Широта и долгота подаются на вход в радианах.
// Диапазон изменения подаваемой на вход широты [-pi/2; +pi/2]
// Диапазон изменения подаваемой на вход долготы может быть либо [0; +2*pi), либо [-pi; +pi]
// Результат возвращается также в радианах, но долгота возвращается только в пределах [0; +2*pi)
TArraySpot AMinusBSimpleResult(TSpot A, TArraySpot B);
//Из нескольких никак не связанных друг с другом множеств A вычитает несколько множеств B, при этом результирующие
// множества являются простыми полигонами (не имеют дырок и каждый состоит из одного контура).
// Задача применяется для изменения площадного объекта наблюдения в процессе покрытия его сканами
// Широта и долгота подаются на вход в радианах.
// Диапазон изменения подаваемой на вход широты [-pi/2; +pi/2]
// Диапазон изменения подаваемой на вход долготы может быть либо [0; +2*pi), либо [-pi; +pi]
// Результат возвращается также в радианах, но долгота возвращается только в пределах [0; +2*pi)
TArraySpot AMinusBSimpleResult(TArraySpot A, TArraySpot B);
//К множеству A прибавляет множество B, при этом результирующие множества являются простыми полигонами (не имеют
// дырок и каждый состоит из одного контура). Задача применяется для изменения площадного объекта наблюдения
// в процессе покрытия его сканами
// Широта и долгота подаются на вход в радианах.
// Диапазон изменения подаваемой на вход широты [-pi/2; +pi/2]
// Диапазон изменения подаваемой на вход долготы может быть либо [0; +2*pi), либо [-pi; +pi]
// Результат возвращается также в радианах, но долгота возвращается только в пределах [0; +2*pi)
TArraySpot APlusBSimpleResult(TSpot A, TSpot B);
//Складывает (прибавляет одно к другому) множества A, при этом результирующие множества являются
// простыми полигонами (не имеют дырок и каждый состоит из одного контура). Задача применяется для изменения
// площадного объекта наблюдения в процессе покрытия его сканами
// Широта и долгота подаются на вход в радианах.
// Диапазон изменения подаваемой на вход широты [-pi/2; +pi/2]
// Диапазон изменения подаваемой на вход долготы может быть либо [0; +2*pi), либо [-pi; +pi]
// Результат возвращается также в радианах, но долгота возвращается только в пределах [0; +2*pi)
TArraySpot APlusASimpleResult(TArraySpot A);
//Безопасный арккосинус
static double ArcCos(double Value);
};
#endif