1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 package com.irurueta.navigation.lateration;
17
18 import com.irurueta.geometry.Circle;
19 import com.irurueta.geometry.InhomogeneousPoint2D;
20 import com.irurueta.geometry.Point2D;
21 import com.irurueta.navigation.LockedException;
22
23
24
25
26 public class HomogeneousLinearLeastSquaresLateration2DSolver extends
27 HomogeneousLinearLeastSquaresLaterationSolver<Point2D> {
28
29
30
31
32 public HomogeneousLinearLeastSquaresLateration2DSolver() {
33 super();
34 }
35
36
37
38
39
40
41
42
43
44 public HomogeneousLinearLeastSquaresLateration2DSolver(final Point2D[] positions, final double[] distances) {
45 super(positions, distances);
46 }
47
48
49
50
51
52
53 public HomogeneousLinearLeastSquaresLateration2DSolver(final LaterationSolverListener<Point2D> listener) {
54 super(listener);
55 }
56
57
58
59
60
61
62
63
64
65
66 public HomogeneousLinearLeastSquaresLateration2DSolver(
67 final Point2D[] positions, final double[] distances, final LaterationSolverListener<Point2D> listener) {
68 super(positions, distances, listener);
69 }
70
71
72
73
74
75
76
77 public HomogeneousLinearLeastSquaresLateration2DSolver(final Circle[] circles) {
78 super();
79 internalSetCircles(circles);
80 }
81
82
83
84
85
86
87
88
89 public HomogeneousLinearLeastSquaresLateration2DSolver(
90 final Circle[] circles, final LaterationSolverListener<Point2D> listener) {
91 super(listener);
92 internalSetCircles(circles);
93 }
94
95
96
97
98
99
100 public Circle[] getCircles() {
101 if (positions == null) {
102 return null;
103 }
104
105 final var result = new Circle[positions.length];
106
107 for (var i = 0; i < positions.length; i++) {
108 result[i] = new Circle(positions[i], distances[i]);
109 }
110 return result;
111 }
112
113
114
115
116
117
118
119
120
121 public void setCircles(final Circle[] circles) throws LockedException {
122 if (isLocked()) {
123 throw new LockedException();
124 }
125 internalSetCircles(circles);
126 }
127
128
129
130
131
132
133 @Override
134 public int getNumberOfDimensions() {
135 return Point2D.POINT2D_INHOMOGENEOUS_COORDINATES_LENGTH;
136 }
137
138
139
140
141
142
143
144 @Override
145 public int getMinRequiredPositionsAndDistances() {
146 return Point2D.POINT2D_INHOMOGENEOUS_COORDINATES_LENGTH + 1;
147 }
148
149
150
151
152
153
154 @Override
155 public Point2D getEstimatedPosition() {
156 if (estimatedPositionCoordinates == null) {
157 return null;
158 }
159
160 final var position = new InhomogeneousPoint2D();
161 getEstimatedPosition(position);
162 return position;
163 }
164
165
166
167
168
169
170
171
172 private void internalSetCircles(final Circle[] circles) {
173 if (circles == null || circles.length < getMinRequiredPositionsAndDistances()) {
174 throw new IllegalArgumentException();
175 }
176
177 final var positions = new Point2D[circles.length];
178 final var distances = new double[circles.length];
179 for (var i = 0; i < circles.length; i++) {
180 final var circle = circles[i];
181 positions[i] = circle.getCenter();
182 distances[i] = circle.getRadius();
183 }
184
185 internalSetPositionsAndDistances(positions, distances);
186 }
187 }