@@ -6,16 +6,16 @@ namespace AlgorithmsLibrary
6
6
public class Fourier
7
7
{
8
8
private double polyLineLength ;
9
- private int fourierSeriesLength ;
10
- private double [ , ] XParameter ;
11
- private double [ , ] YParameter ;
9
+ private readonly int fourierSeriesLength ;
10
+ private readonly double [ , ] XParameter ;
11
+ private readonly double [ , ] YParameter ;
12
12
13
- private List < MapPoint > arrayOfMapPoints ;
14
- private int countOfPointsObject ;
15
- private double [ ] S ; // sequentialPolylineLength
13
+ private readonly List < MapPoint > arrayOfMapPoints ;
14
+ private readonly int countOfPointsObject ;
15
+ private double [ ] sequentialPolylineLength ;
16
16
private double [ ] arrayDistancesBetweenPoints ;
17
17
18
- private bool FourierClosedType ;
18
+ private readonly bool FourierClosedType ;
19
19
20
20
public Fourier ( List < MapPoint > mapPoints , int fourierSeriesLength , double approximationRatio , bool FourierClosedType )
21
21
{
@@ -66,7 +66,7 @@ private void AddSymmetricPolyline()
66
66
MapPoint startPoint = arrayOfMapPoints [ 0 ] ;
67
67
MapPoint endPoint = arrayOfMapPoints [ basePointCount - 1 ] ;
68
68
Line SymmetryAxis = new Line ( startPoint , endPoint ) ;
69
-
69
+
70
70
for ( int i = basePointCount ; i < countOfPointsObject ; i ++ )
71
71
{
72
72
MapPoint SymmetryPoint = SymmetryAxis . GetSymmetricPoint ( arrayOfMapPoints [ countOfPointsObject - 1 - i ] ) ;
@@ -77,7 +77,7 @@ private void AddSymmetricPolyline()
77
77
public void GetAllDist ( )
78
78
{
79
79
arrayDistancesBetweenPoints = new double [ countOfPointsObject - 1 ] ;
80
- S = new double [ countOfPointsObject ] ;
80
+ sequentialPolylineLength = new double [ countOfPointsObject ] ;
81
81
82
82
if ( ! FourierClosedType )
83
83
AddSymmetricPolyline ( ) ;
@@ -90,22 +90,64 @@ public void GetAllDist()
90
90
arrayDistancesBetweenPoints [ i ] = p1 . DistanceToVertex ( p2 ) ;
91
91
}
92
92
93
- S [ 0 ] = 0.0 ;
93
+ sequentialPolylineLength [ 0 ] = 0.0 ;
94
94
for ( int i = 1 ; i < countOfPointsObject ; i ++ )
95
95
{
96
- double previousSequentialLength = S [ i - 1 ] ;
97
- S [ i ] = previousSequentialLength + arrayDistancesBetweenPoints [ i - 1 ] ;
96
+ double previousSequentialLength = sequentialPolylineLength [ i - 1 ] ;
97
+ sequentialPolylineLength [ i ] = previousSequentialLength + arrayDistancesBetweenPoints [ i - 1 ] ;
98
98
}
99
99
100
- polyLineLength = S [ countOfPointsObject - 1 ] ;
100
+ polyLineLength = sequentialPolylineLength [ countOfPointsObject - 1 ] ;
101
+ }
102
+
103
+ public double GetRealParameter ( int k , double angle )
104
+ {
105
+ double TK1 = arrayOfMapPoints [ k + 1 ] . X ;
106
+ double TK = arrayOfMapPoints [ k ] . X ;
107
+ double SK1 = sequentialPolylineLength [ k + 1 ] ;
108
+ double SK = sequentialPolylineLength [ k ] ;
109
+
110
+ double divTS = ( TK1 - TK ) / ( SK1 - SK ) ;
111
+
112
+ double SinK1 = Math . Sin ( angle * SK1 ) ;
113
+ double SinK = Math . Sin ( angle * SK ) ;
114
+ double CosK1 = Math . Cos ( angle * SK1 ) ;
115
+ double CosK = Math . Cos ( angle * SK ) ;
116
+
117
+ double v1 = ( TK - divTS * SK ) * ( SinK1 - SinK ) / angle ;
118
+ double v2 = divTS * ( SinK1 * SK1 - SinK * SK ) / angle ;
119
+ double v3 = divTS * ( CosK1 - CosK ) / ( angle * angle ) ;
120
+
121
+ return ( v1 + v2 + v3 ) * 2 / polyLineLength ;
122
+ }
123
+
124
+ public double GetImagineParameter ( int k , double angle )
125
+ {
126
+ double TK1 = arrayOfMapPoints [ k + 1 ] . X ;
127
+ double TK = arrayOfMapPoints [ k ] . X ;
128
+ double SK1 = sequentialPolylineLength [ k + 1 ] ;
129
+ double SK = sequentialPolylineLength [ k ] ;
130
+
131
+ double divTS = ( TK1 - TK ) / ( SK1 - SK ) ;
132
+
133
+ double SinK1 = Math . Sin ( angle * SK1 ) ;
134
+ double SinK = Math . Sin ( angle * SK ) ;
135
+ double CosK1 = Math . Cos ( angle * SK1 ) ;
136
+ double CosK = Math . Cos ( angle * SK ) ;
137
+
138
+ double v1 = - ( TK - divTS * SK ) * ( CosK1 - CosK ) / angle ;
139
+ double v2 = - divTS * ( CosK1 * SK1 - CosK * SK ) / angle ;
140
+ double v3 = divTS * ( SinK1 - SinK ) / ( angle * angle ) ;
141
+
142
+ return ( v1 + v2 + v3 ) * 2 / polyLineLength ;
101
143
}
102
144
103
145
public double [ , ] GetFourierXparameter ( )
104
146
{
105
147
for ( int k = 0 ; k < countOfPointsObject - 1 ; k ++ )
106
148
{
107
149
double diffX = arrayOfMapPoints [ k + 1 ] . X - arrayOfMapPoints [ k ] . X ;
108
- double diffS = S [ k + 1 ] - S [ k ] ;
150
+ double diffS = sequentialPolylineLength [ k + 1 ] - sequentialPolylineLength [ k ] ;
109
151
double summ1 = arrayOfMapPoints [ k ] . X * diffS ;
110
152
double summ2 = 0.5 * diffX * diffS ;
111
153
XParameter [ 0 , 0 ] += ( summ1 + summ2 ) / polyLineLength ;
@@ -116,38 +158,12 @@ public void GetAllDist()
116
158
double angle = 2.0 * Math . PI * n / polyLineLength ;
117
159
for ( int k = 0 ; k < countOfPointsObject - 1 ; k ++ )
118
160
{
119
- double XK1 = arrayOfMapPoints [ k + 1 ] . X ;
120
- double XK = arrayOfMapPoints [ k ] . X ;
121
- double divXS = ( XK1 - XK ) / ( S [ k + 1 ] - S [ k ] ) ;
122
-
123
- double SinK1 = Math . Sin ( angle * S [ k + 1 ] ) ;
124
- double SinK = Math . Sin ( angle * S [ k ] ) ;
125
- double CosK1 = Math . Cos ( angle * S [ k + 1 ] ) ;
126
- double CosK = Math . Cos ( angle * S [ k ] ) ;
127
-
128
- double v1 = ( XK - divXS * S [ k ] ) * ( SinK1 - SinK ) / angle ;
129
- double v2 = divXS * ( SinK1 * S [ k + 1 ] - SinK * S [ k ] ) / angle ;
130
- double v3 = divXS * ( CosK1 - CosK ) / ( angle * angle ) ;
131
-
132
- XParameter [ n , 0 ] += ( v1 + v2 + v3 ) * 2 / polyLineLength ;
161
+ XParameter [ n , 0 ] += GetRealParameter ( k , angle ) ;
133
162
}
134
163
135
164
for ( int k = 0 ; k < countOfPointsObject - 1 ; k ++ )
136
165
{
137
- double XK1 = arrayOfMapPoints [ k + 1 ] . X ;
138
- double XK = arrayOfMapPoints [ k ] . X ;
139
- double divXS = ( XK1 - XK ) / ( S [ k + 1 ] - S [ k ] ) ;
140
-
141
- double SinK1 = Math . Sin ( angle * S [ k + 1 ] ) ;
142
- double SinK = Math . Sin ( angle * S [ k ] ) ;
143
- double CosK1 = Math . Cos ( angle * S [ k + 1 ] ) ;
144
- double CosK = Math . Cos ( angle * S [ k ] ) ;
145
-
146
- double v1 = - ( XK - divXS * S [ k ] ) * ( CosK1 - CosK ) / angle ;
147
- double v2 = - divXS * ( CosK1 * S [ k + 1 ] - CosK * S [ k ] ) / angle ;
148
- double v3 = divXS * ( SinK1 - SinK ) / ( angle * angle ) ;
149
-
150
- XParameter [ n , 1 ] += ( v1 + v2 + v3 ) * 2 / polyLineLength ;
166
+ XParameter [ n , 1 ] += GetImagineParameter ( k , angle ) ;
151
167
}
152
168
}
153
169
@@ -158,7 +174,7 @@ public void GetAllDist()
158
174
for ( int k = 0 ; k < countOfPointsObject - 1 ; k ++ )
159
175
{
160
176
double diffY = arrayOfMapPoints [ k + 1 ] . Y - arrayOfMapPoints [ k ] . Y ;
161
- double diffS = S [ k + 1 ] - S [ k ] ;
177
+ double diffS = sequentialPolylineLength [ k + 1 ] - sequentialPolylineLength [ k ] ;
162
178
double summ1 = arrayOfMapPoints [ k ] . Y * diffS ;
163
179
double summ2 = 0.5 * diffY * diffS ;
164
180
YParameter [ 0 , 0 ] += ( summ1 + summ2 ) / polyLineLength ;
@@ -169,38 +185,12 @@ public void GetAllDist()
169
185
double angle = 2.0 * Math . PI * n / polyLineLength ;
170
186
for ( int k = 0 ; k < countOfPointsObject - 1 ; k ++ )
171
187
{
172
- double YK1 = arrayOfMapPoints [ k + 1 ] . Y ;
173
- double YK = arrayOfMapPoints [ k ] . Y ;
174
- double divYS = ( YK1 - YK ) / ( S [ k + 1 ] - S [ k ] ) ;
175
-
176
- double SinK1 = Math . Sin ( angle * S [ k + 1 ] ) ;
177
- double SinK = Math . Sin ( angle * S [ k ] ) ;
178
- double CosK1 = Math . Cos ( angle * S [ k + 1 ] ) ;
179
- double CosK = Math . Cos ( angle * S [ k ] ) ;
180
-
181
- double v1 = ( YK - divYS * S [ k ] ) * ( SinK1 - SinK ) / angle ;
182
- double v2 = divYS * ( SinK1 * S [ k + 1 ] - SinK * S [ k ] ) / angle ;
183
- double v3 = divYS * ( CosK1 - CosK ) / ( angle * angle ) ;
184
-
185
- YParameter [ n , 0 ] += ( v1 + v2 + v3 ) * 2 / polyLineLength ;
188
+ YParameter [ n , 0 ] += GetRealParameter ( k , angle ) ;
186
189
}
187
190
188
191
for ( int k = 0 ; k < countOfPointsObject - 1 ; k ++ )
189
192
{
190
- double YK1 = arrayOfMapPoints [ k + 1 ] . Y ;
191
- double YK = arrayOfMapPoints [ k ] . Y ;
192
- double divYS = ( YK1 - YK ) / ( S [ k + 1 ] - S [ k ] ) ;
193
-
194
- double SinK1 = Math . Sin ( angle * S [ k + 1 ] ) ;
195
- double SinK = Math . Sin ( angle * S [ k ] ) ;
196
- double CosK1 = Math . Cos ( angle * S [ k + 1 ] ) ;
197
- double CosK = Math . Cos ( angle * S [ k ] ) ;
198
-
199
- double v1 = - ( YK - divYS * S [ k ] ) * ( CosK1 - CosK ) / angle ;
200
- double v2 = - divYS * ( CosK1 * S [ k + 1 ] - CosK * S [ k ] ) / angle ;
201
- double v3 = divYS * ( SinK1 - SinK ) / ( angle * angle ) ;
202
-
203
- YParameter [ n , 1 ] += ( v1 + v2 + v3 ) * 2 / polyLineLength ;
193
+ YParameter [ n , 1 ] += GetImagineParameter ( k , angle ) ;
204
194
}
205
195
}
206
196
@@ -234,4 +224,4 @@ public List<MapPoint> GetRecoveryPoints(int OutputPointCount)
234
224
return RecoveryPoints ;
235
225
}
236
226
}
237
- }
227
+ }
0 commit comments