Commit 968f0b8d authored by Benedikt Zoennchen's avatar Benedikt Zoennchen
Browse files

simplify the splitEdge and splitTriangle operation and add a face iterator to...

simplify the splitEdge and splitTriangle operation and add a face iterator to the delaunay-triangulation
parent 897bde6e
...@@ -64,6 +64,8 @@ public class Face<P extends IPoint> implements Iterable<HalfEdge<P>> { ...@@ -64,6 +64,8 @@ public class Face<P extends IPoint> implements Iterable<HalfEdge<P>> {
private boolean border; private boolean border;
private boolean destroyed = false;
/** /**
* Default constructor. To construct a face where you have already some half-edges * Default constructor. To construct a face where you have already some half-edges
* bordering this face. * bordering this face.
...@@ -95,12 +97,17 @@ public class Face<P extends IPoint> implements Iterable<HalfEdge<P>> { ...@@ -95,12 +97,17 @@ public class Face<P extends IPoint> implements Iterable<HalfEdge<P>> {
return border; return border;
} }
public void destroy() {
setEdge(null);
destroyed = true;
}
/** /**
* Sets one of the half-edges bordering this face. * Sets one of the half-edges bordering this face.
* *
* @param edge half-edge bordering this face * @param edge half-edge bordering this face
*/ */
public void setEdge(@NotNull HalfEdge<P> edge) { public void setEdge(final HalfEdge<P> edge) {
this.edge = edge; this.edge = edge;
} }
...@@ -108,6 +115,10 @@ public class Face<P extends IPoint> implements Iterable<HalfEdge<P>> { ...@@ -108,6 +115,10 @@ public class Face<P extends IPoint> implements Iterable<HalfEdge<P>> {
return edge; return edge;
} }
public boolean isDestroyed() {
return destroyed;
}
/** /**
* Computes the area of this face. * Computes the area of this face.
* *
......
...@@ -5,12 +5,12 @@ import org.vadere.util.geometry.shapes.IPoint; ...@@ -5,12 +5,12 @@ import org.vadere.util.geometry.shapes.IPoint;
import java.util.Set; import java.util.Set;
import java.util.stream.Stream; import java.util.stream.Stream;
public interface Triangulation<P extends IPoint> { public interface Triangulation<P extends IPoint> extends Iterable<Face<P>> {
void compute(); void compute();
Face<P> locate(final double x, final double y); Face<P> locate(final double x, final double y);
Face<P> locate(final IPoint point); Face<P> locate(final IPoint point);
Stream<Face<P>> streamFaces(); Stream<Face<P>> streamFaces();
Set<Face<P>> getFaces(); Set<Face<P>> getFaces();
HalfEdge<P> insert(final P point); void insert(final P point);
void remove(final P point); void remove(final P point);
} }
...@@ -32,8 +32,8 @@ public class UniformTriangulation<P extends IPoint> extends DelaunayTriangulatio ...@@ -32,8 +32,8 @@ public class UniformTriangulation<P extends IPoint> extends DelaunayTriangulatio
this.minTriangleSideLength = minTriangleSideLength; this.minTriangleSideLength = minTriangleSideLength;
this.pointConstructor = pointConstructor; this.pointConstructor = pointConstructor;
List<P> pointList = new ArrayList<P>(generatePointSet()); List<P> pointList = new ArrayList<>(generatePointSet());
Collections.shuffle(pointList); //Collections.shuffle(pointList);
for(P point : pointList) { for(P point : pointList) {
insert(point); insert(point);
} }
......
...@@ -14,6 +14,7 @@ import java.util.Collection; ...@@ -14,6 +14,7 @@ import java.util.Collection;
import java.util.HashSet; import java.util.HashSet;
import java.util.Random; import java.util.Random;
import java.util.Set; import java.util.Set;
import java.util.stream.Collectors;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
...@@ -39,11 +40,45 @@ public class TestBoyerWatson { ...@@ -39,11 +40,45 @@ public class TestBoyerWatson {
points.add(p3); points.add(p3);
points.add(p4); points.add(p4);
points.add(p6); points.add(p6);
points.add(p5);
DelaunayTriangulation<VPoint> boyerWatsonImproved = new DelaunayTriangulation<>(points, (x, y) -> new VPoint(x, y)); DelaunayTriangulation<VPoint> boyerWatsonImproved = new DelaunayTriangulation<>(points, (x, y) -> new VPoint(x, y));
boyerWatsonImproved.compute(); boyerWatsonImproved.compute();
Collection<VTriangle> triangulation = boyerWatsonImproved.getTriangles(); boyerWatsonImproved.finalize();
triangulation.forEach(System.out::print);
Set<VTriangle> triangulation = new HashSet<>(boyerWatsonImproved.getTriangles());
Set<VPoint> triangle1 = new HashSet<>();
triangle1.add(p1);
triangle1.add(p5);
triangle1.add(p4);
Set<VPoint> triangle2 = new HashSet<>();
triangle2.add(p1);
triangle2.add(p2);
triangle2.add(p5);
Set<VPoint> triangle3 = new HashSet<>();
triangle3.add(p2);
triangle3.add(p3);
triangle3.add(p5);
Set<VPoint> triangle4 = new HashSet<>();
triangle4.add(p4);
triangle4.add(p5);
triangle4.add(p3);
Set<Set<VPoint>> pointSets = triangulation.stream().map(t -> new HashSet<>(t.getPoints())).collect(Collectors.toSet());
Set<Set<VPoint>> expextedPointSets = new HashSet<>();
expextedPointSets.add(triangle1);
expextedPointSets.add(triangle2);
expextedPointSets.add(triangle3);
expextedPointSets.add(triangle4);
assertTrue(expextedPointSets.equals(pointSets));
triangulation.forEach(System.out::println);
} }
@Test @Test
...@@ -61,12 +96,13 @@ public class TestBoyerWatson { ...@@ -61,12 +96,13 @@ public class TestBoyerWatson {
Face<VPoint> face = Face.of(p1,p2,p3); Face<VPoint> face = Face.of(p1,p2,p3);
DAG<DAGElement<VPoint>> dag = new DAG<>(new DAGElement<>(face, Triple.of(p1,p2,p3))); DAG<DAGElement<VPoint>> dag = new DAG<>(new DAGElement<>(face, Triple.of(p1,p2,p3)));
DelaunayTriangulation<VPoint> boyerWatsonImproved = new DelaunayTriangulation<>(points, (x, y) -> new VPoint(x, y)); DelaunayTriangulation<VPoint> triangulation = new DelaunayTriangulation<>(points, (x, y) -> new VPoint(x, y));
HalfEdge<VPoint> result = boyerWatsonImproved.split(centerPoint, dag); triangulation.splitTriangleDB(centerPoint, dag);
triangulation.finalize();
Set<VTriangle> triangulation = new HashSet<>(result.collectLeafs().stream().map(dagElement -> dagElement.getTriangle()).collect(Collectors.toList())); Set<VTriangle> triangles = new HashSet<>(triangulation.getTriangles());
Set<VTriangle> expectedResult = new HashSet<>(Arrays.asList(new VTriangle(p1, p2, centerPoint), new VTriangle(p2, p3, centerPoint), new VTriangle(p1, p3, centerPoint))); Set<VTriangle> expectedResult = new HashSet<>(Arrays.asList(new VTriangle(p1, p2, centerPoint), new VTriangle(p2, p3, centerPoint), new VTriangle(p1, p3, centerPoint)));
assertTrue(testTriangulationEquality(triangulation, expectedResult)); assertTrue(testTriangulationEquality(triangles, expectedResult));
} }
@Test @Test
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment