Skip to content

Commit 2bd5f97

Browse files
committed
Merge branch 'issue-368'
2 parents 2b5ed95 + c22c05e commit 2bd5f97

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

61 files changed

+1533
-1478
lines changed

hipparchus-geometry/src/changes/changes.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,12 @@ If the output is not quite correct, check for invisible trailing spaces!
4949
<title>Hipparchus Geometry Release Notes</title>
5050
</properties>
5151
<release version="4.0" date="TBD" description="TBD">
52+
<action dev="luc" type="fix" issue="issues/368">
53+
Added point type to geometry classes parameters
54+
</action>
55+
<action dev="luc" type="update" issue="issues/314">
56+
Improved robustness of BSP tree operations
57+
</action>
5258
<action dev="vincent" type="update" issue="issues/285">
5359
Migrated tests from JUnit 4 to JUnit 5
5460
</action>

hipparchus-geometry/src/main/java/org/hipparchus/geometry/euclidean/oned/IntervalsSet.java

Lines changed: 52 additions & 61 deletions
Large diffs are not rendered by default.

hipparchus-geometry/src/main/java/org/hipparchus/geometry/euclidean/oned/OrientedPoint.java

Lines changed: 6 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,14 @@
2121
*/
2222
package org.hipparchus.geometry.euclidean.oned;
2323

24-
import org.hipparchus.geometry.Point;
25-
import org.hipparchus.geometry.Vector;
2624
import org.hipparchus.geometry.partitioning.Hyperplane;
2725

2826
/** This class represents a 1D oriented hyperplane.
2927
* <p>An hyperplane in 1D is a simple point, its orientation being a
3028
* boolean.</p>
3129
* <p>Instances of this class are guaranteed to be immutable.</p>
3230
*/
33-
public class OrientedPoint implements Hyperplane<Euclidean1D> {
31+
public class OrientedPoint implements Hyperplane<Euclidean1D, Vector1D> {
3432

3533
/** Vector location. */
3634
private final Vector1D location;
@@ -63,18 +61,10 @@ public OrientedPoint copySelf() {
6361
return this;
6462
}
6563

66-
/** Get the offset (oriented distance) of a vector.
67-
* @param vector vector to check
68-
* @return offset of the vector
69-
*/
70-
public double getOffset(Vector<Euclidean1D, Vector1D> vector) {
71-
return getOffset((Point<Euclidean1D>) vector);
72-
}
73-
7464
/** {@inheritDoc} */
7565
@Override
76-
public double getOffset(final Point<Euclidean1D> point) {
77-
final double delta = ((Vector1D) point).getX() - location.getX();
66+
public double getOffset(final Vector1D point) {
67+
final double delta = point.getX() - location.getX();
7868
return direct ? delta : -delta;
7969
}
8070

@@ -121,14 +111,14 @@ public IntervalsSet wholeSpace() {
121111

122112
/** {@inheritDoc} */
123113
@Override
124-
public boolean sameOrientationAs(final Hyperplane<Euclidean1D> other) {
125-
return !(direct ^ ((OrientedPoint) other).direct);
114+
public boolean sameOrientationAs(final Hyperplane<Euclidean1D, Vector1D> other) {
115+
return direct == ((OrientedPoint) other).direct;
126116
}
127117

128118
/** {@inheritDoc}
129119
*/
130120
@Override
131-
public Point<Euclidean1D> project(Point<Euclidean1D> point) {
121+
public Vector1D project(Vector1D point) {
132122
return location;
133123
}
134124

hipparchus-geometry/src/main/java/org/hipparchus/geometry/euclidean/oned/SubOrientedPoint.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,14 +30,14 @@
3030
* boolean.</p>
3131
* <p>Instances of this class are guaranteed to be immutable.</p>
3232
*/
33-
public class SubOrientedPoint extends AbstractSubHyperplane<Euclidean1D, Euclidean1D> {
33+
public class SubOrientedPoint extends AbstractSubHyperplane<Euclidean1D, Vector1D, Euclidean1D, Vector1D> {
3434

3535
/** Simple constructor.
3636
* @param hyperplane underlying hyperplane
3737
* @param remainingRegion remaining region of the hyperplane
3838
*/
39-
public SubOrientedPoint(final Hyperplane<Euclidean1D> hyperplane,
40-
final Region<Euclidean1D> remainingRegion) {
39+
public SubOrientedPoint(final Hyperplane<Euclidean1D, Vector1D> hyperplane,
40+
final Region<Euclidean1D, Vector1D> remainingRegion) {
4141
super(hyperplane, remainingRegion);
4242
}
4343

@@ -55,21 +55,22 @@ public boolean isEmpty() {
5555

5656
/** {@inheritDoc} */
5757
@Override
58-
protected AbstractSubHyperplane<Euclidean1D, Euclidean1D> buildNew(final Hyperplane<Euclidean1D> hyperplane,
59-
final Region<Euclidean1D> remainingRegion) {
58+
protected AbstractSubHyperplane<Euclidean1D, Vector1D, Euclidean1D, Vector1D>
59+
buildNew(final Hyperplane<Euclidean1D, Vector1D> hyperplane,
60+
final Region<Euclidean1D, Vector1D> remainingRegion) {
6061
return new SubOrientedPoint(hyperplane, remainingRegion);
6162
}
6263

6364
/** {@inheritDoc} */
6465
@Override
65-
public SplitSubHyperplane<Euclidean1D> split(final Hyperplane<Euclidean1D> hyperplane) {
66+
public SplitSubHyperplane<Euclidean1D, Vector1D> split(final Hyperplane<Euclidean1D, Vector1D> hyperplane) {
6667
final double global = hyperplane.getOffset(((OrientedPoint) getHyperplane()).getLocation());
6768
if (global < -hyperplane.getTolerance()) {
68-
return new SplitSubHyperplane<Euclidean1D>(null, this);
69+
return new SplitSubHyperplane<>(null, this);
6970
} else if (global > hyperplane.getTolerance()) {
70-
return new SplitSubHyperplane<Euclidean1D>(this, null);
71+
return new SplitSubHyperplane<>(this, null);
7172
} else {
72-
return new SplitSubHyperplane<Euclidean1D>(null, null);
73+
return new SplitSubHyperplane<>(null, null);
7374
}
7475
}
7576

hipparchus-geometry/src/main/java/org/hipparchus/geometry/euclidean/threed/Line.java

Lines changed: 5 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@
2323

2424
import org.hipparchus.exception.LocalizedCoreFormats;
2525
import org.hipparchus.exception.MathIllegalArgumentException;
26-
import org.hipparchus.geometry.Point;
27-
import org.hipparchus.geometry.Vector;
2826
import org.hipparchus.geometry.euclidean.oned.Euclidean1D;
2927
import org.hipparchus.geometry.euclidean.oned.IntervalsSet;
3028
import org.hipparchus.geometry.euclidean.oned.Vector1D;
@@ -44,7 +42,7 @@
4442
* @see #fromDirection(Vector3D, Vector3D, double)
4543
* @see #Line(Vector3D, Vector3D, double)
4644
*/
47-
public class Line implements Embedding<Euclidean3D, Euclidean1D> {
45+
public class Line implements Embedding<Euclidean3D, Vector3D, Euclidean1D, Vector1D> {
4846

4947
/** Line direction. */
5048
private Vector3D direction;
@@ -181,38 +179,20 @@ public Vector3D pointAt(final double abscissa) {
181179
return new Vector3D(1.0, zero, abscissa, direction);
182180
}
183181

184-
/** Transform a space point into a sub-space point.
185-
* @param vector n-dimension point of the space
186-
* @return (n-1)-dimension point of the sub-space corresponding to
187-
* the specified space point
188-
*/
189-
public Vector1D toSubSpace(Vector<Euclidean3D, Vector3D> vector) {
190-
return toSubSpace((Point<Euclidean3D>) vector);
191-
}
192-
193-
/** Transform a sub-space point into a space point.
194-
* @param vector (n-1)-dimension point of the sub-space
195-
* @return n-dimension point of the space corresponding to the
196-
* specified sub-space point
197-
*/
198-
public Vector3D toSpace(Vector<Euclidean1D, Vector1D> vector) {
199-
return toSpace((Point<Euclidean1D>) vector);
200-
}
201-
202182
/** {@inheritDoc}
203183
* @see #getAbscissa(Vector3D)
204184
*/
205185
@Override
206-
public Vector1D toSubSpace(final Point<Euclidean3D> point) {
207-
return new Vector1D(getAbscissa((Vector3D) point));
186+
public Vector1D toSubSpace(final Vector3D point) {
187+
return new Vector1D(getAbscissa(point));
208188
}
209189

210190
/** {@inheritDoc}
211191
* @see #pointAt(double)
212192
*/
213193
@Override
214-
public Vector3D toSpace(final Point<Euclidean1D> point) {
215-
return pointAt(((Vector1D) point).getX());
194+
public Vector3D toSpace(final Vector1D point) {
195+
return pointAt(point.getX());
216196
}
217197

218198
/** Check if the instance is similar to another line.

hipparchus-geometry/src/main/java/org/hipparchus/geometry/euclidean/threed/OutlineExtractor.java

Lines changed: 15 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@
2323

2424
import java.util.ArrayList;
2525

26-
import org.hipparchus.geometry.Point;
2726
import org.hipparchus.geometry.euclidean.twod.Euclidean2D;
2827
import org.hipparchus.geometry.euclidean.twod.PolygonsSet;
2928
import org.hipparchus.geometry.euclidean.twod.Vector2D;
@@ -123,7 +122,7 @@ private boolean pointIsBetween(final Vector2D[] loop, final int n, final int i)
123122
}
124123

125124
/** Visitor projecting the boundary facets on a plane. */
126-
private class BoundaryProjector implements BSPTreeVisitor<Euclidean3D> {
125+
private class BoundaryProjector implements BSPTreeVisitor<Euclidean3D, Vector3D> {
127126

128127
/** Projection of the polyhedrons set on the plane. */
129128
private PolygonsSet projected;
@@ -135,22 +134,22 @@ private class BoundaryProjector implements BSPTreeVisitor<Euclidean3D> {
135134
* @param tolerance tolerance below which points are considered identical
136135
*/
137136
BoundaryProjector(final double tolerance) {
138-
this.projected = new PolygonsSet(new BSPTree<Euclidean2D>(Boolean.FALSE), tolerance);
137+
this.projected = new PolygonsSet(new BSPTree<>(Boolean.FALSE), tolerance);
139138
this.tolerance = tolerance;
140139
}
141140

142141
/** {@inheritDoc} */
143142
@Override
144-
public Order visitOrder(final BSPTree<Euclidean3D> node) {
143+
public Order visitOrder(final BSPTree<Euclidean3D, Vector3D> node) {
145144
return Order.MINUS_SUB_PLUS;
146145
}
147146

148147
/** {@inheritDoc} */
149148
@Override
150-
public void visitInternalNode(final BSPTree<Euclidean3D> node) {
149+
public void visitInternalNode(final BSPTree<Euclidean3D, Vector3D> node) {
151150
@SuppressWarnings("unchecked")
152-
final BoundaryAttribute<Euclidean3D> attribute =
153-
(BoundaryAttribute<Euclidean3D>) node.getAttribute();
151+
final BoundaryAttribute<Euclidean3D, Vector3D> attribute =
152+
(BoundaryAttribute<Euclidean3D, Vector3D>) node.getAttribute();
154153
if (attribute.getPlusOutside() != null) {
155154
addContribution(attribute.getPlusOutside());
156155
}
@@ -161,17 +160,17 @@ public void visitInternalNode(final BSPTree<Euclidean3D> node) {
161160

162161
/** {@inheritDoc} */
163162
@Override
164-
public void visitLeafNode(final BSPTree<Euclidean3D> node) {
163+
public void visitLeafNode(final BSPTree<Euclidean3D, Vector3D> node) {
165164
}
166165

167166
/** Add he contribution of a boundary facet.
168167
* @param facet boundary facet
169168
*/
170-
private void addContribution(final SubHyperplane<Euclidean3D> facet) {
169+
private void addContribution(final SubHyperplane<Euclidean3D, Vector3D> facet) {
171170

172171
// extract the vertices of the facet
173-
final AbstractSubHyperplane<Euclidean3D, Euclidean2D> absFacet =
174-
(AbstractSubHyperplane<Euclidean3D, Euclidean2D>) facet;
172+
final AbstractSubHyperplane<Euclidean3D, Vector3D, Euclidean2D, Vector2D> absFacet =
173+
(AbstractSubHyperplane<Euclidean3D, Vector3D, Euclidean2D, Vector2D>) facet;
175174
final Plane plane = (Plane) facet.getHyperplane();
176175

177176
final double scal = plane.getNormal().dotProduct(w);
@@ -205,21 +204,21 @@ private void addContribution(final SubHyperplane<Euclidean3D> facet) {
205204
}
206205

207206
// compute the projection of the facet in the outline plane
208-
final ArrayList<SubHyperplane<Euclidean2D>> edges = new ArrayList<>();
207+
final ArrayList<SubHyperplane<Euclidean2D, Vector2D>> edges = new ArrayList<>();
209208
for (Vector2D[] loop : vertices) {
210209
final boolean closed = loop[0] != null;
211210
int previous = closed ? (loop.length - 1) : 1;
212-
final Vector3D previous3D = plane.toSpace((Point<Euclidean2D>) loop[previous]);
211+
final Vector3D previous3D = plane.toSpace(loop[previous]);
213212
int current = (previous + 1) % loop.length;
214213
Vector2D pPoint = new Vector2D(previous3D.dotProduct(u), previous3D.dotProduct(v));
215214
while (current < loop.length) {
216215

217-
final Vector3D current3D = plane.toSpace((Point<Euclidean2D>) loop[current]);
216+
final Vector3D current3D = plane.toSpace(loop[current]);
218217
final Vector2D cPoint = new Vector2D(current3D.dotProduct(u),
219218
current3D.dotProduct(v));
220219
final org.hipparchus.geometry.euclidean.twod.Line line =
221220
new org.hipparchus.geometry.euclidean.twod.Line(pPoint, cPoint, tolerance);
222-
SubHyperplane<Euclidean2D> edge = line.wholeHyperplane();
221+
SubHyperplane<Euclidean2D, Vector2D> edge = line.wholeHyperplane();
223222

224223
if (closed || (previous != 1)) {
225224
// the previous point is a real vertex
@@ -249,7 +248,7 @@ private void addContribution(final SubHyperplane<Euclidean3D> facet) {
249248
final PolygonsSet projectedFacet = new PolygonsSet(edges, tolerance);
250249

251250
// add the contribution of the facet to the global outline
252-
projected = (PolygonsSet) new RegionFactory<Euclidean2D>().union(projected, projectedFacet);
251+
projected = (PolygonsSet) new RegionFactory<Euclidean2D, Vector2D>().union(projected, projectedFacet);
253252

254253
}
255254
}

0 commit comments

Comments
 (0)