Skip to content

Commit 8382344

Browse files
committed
addressed noncoplanar polygons bug
1 parent 730bb44 commit 8382344

File tree

3 files changed

+33
-18
lines changed

3 files changed

+33
-18
lines changed

src/main/java/eu/mihosoft/vrl/v3d/CSG.java

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1951,13 +1951,7 @@ public CSG transformed(Transform transform) {
19511951
}
19521952

19531953
List<Polygon> newpolygons = this.getPolygons().stream().map(p -> {
1954-
try {
1955-
return p.transformed(transform);
1956-
} catch (Exception e) {
1957-
// e.printStackTrace();
1958-
System.err.println("Removing Polygon during transform");
1959-
return null;
1960-
}
1954+
return p.transformed(transform);
19611955
}).filter(Objects::nonNull).collect(Collectors.toList());
19621956

19631957
CSG csg = CSG.fromPolygons(newpolygons).optimization(getOptType());

src/main/java/eu/mihosoft/vrl/v3d/Plane.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -391,8 +391,8 @@ else if (somePointsInBack) {
391391
back.add(polygon);
392392
break;
393393
case SPANNING:
394-
List<Vertex> f = new ArrayList<>();
395-
List<Vertex> b = new ArrayList<>();
394+
ArrayList<Vertex> f = new ArrayList<>();
395+
ArrayList<Vertex> b = new ArrayList<>();
396396
for (int i = 0; i < polygon.vertices.size(); i++) {
397397
int j = (i + 1) % polygon.vertices.size();
398398
PlaneType ti = types.get(i);
@@ -415,17 +415,18 @@ else if (somePointsInBack) {
415415
}
416416
}
417417
try {
418-
front.add(new Polygon(f, polygon.getStorage()).setColor(polygon.getColor()));
418+
Polygon.arePointsCoplanar(f,polygon.plane.getNormal());
419+
front.add(new Polygon(f, polygon.getStorage(), true, polygon.plane).setColor(polygon.getColor()));
419420
} catch (Exception ex) {
420-
ex.printStackTrace();
421+
ex.printStackTrace();
421422
System.err.println("Pruning bad polygon Plane::splitPolygon");
422423
// skip adding broken polygon here
423424
}
424425

425426
try {
426-
back.add(new Polygon(b, polygon.getStorage()).setColor(polygon.getColor()));
427+
back.add(new Polygon(b, polygon.getStorage(), true, polygon.plane).setColor(polygon.getColor()));
427428
} catch (Exception ex) {
428-
ex.printStackTrace();
429+
ex.printStackTrace();
429430
System.err.println("Pruning bad polygon Plane::splitPolygon");
430431
}
431432

src/main/java/eu/mihosoft/vrl/v3d/Polygon.java

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,23 @@ public Polygon(List<Vertex> vertices, PropertyStorage shared, boolean allowDegen
114114
validateAndInit();
115115
}
116116

117+
/**
118+
* Constructor. Creates a new polygon that consists of the specified vertices.
119+
*
120+
* Note: the vertices used to initialize a polygon must be coplanar and form a
121+
* convex loop.
122+
*
123+
* @param vertices polygon vertices
124+
* @param shared shared property
125+
*/
126+
public Polygon(List<Vertex> vertices, PropertyStorage shared, boolean allowDegenerate, Plane p) {
127+
this.plane = p;
128+
this.vertices = pruneDuplicatePoints(vertices);
129+
this.shared = shared;
130+
131+
validateAndInit();
132+
}
133+
117134
/**
118135
* Constructor. Creates a new polygon that consists of the specified vertices.
119136
*
@@ -166,7 +183,8 @@ public static ArrayList<Vertex> pruneDuplicatePoints(List<Vertex> incoming) {
166183
}
167184

168185
public void validateAndInit() {
169-
this.plane = Plane.createFromPoints(vertices);
186+
if(plane==null)
187+
this.plane = Plane.createFromPoints(vertices);
170188
for (Vertex v : vertices) {
171189
v.normal = plane.getNormal();
172190
// v.pos.roundToEpsilon();
@@ -184,9 +202,11 @@ public void validateAndInit() {
184202

185203
if (areAllPointsCollinear(vertices))
186204
throw new RuntimeException("This polygon is colinear");
187-
if(!arePointsCoplanar(vertices,plane.getNormal()))
188-
throw new RuntimeException("All points are not on plane of epsilon "+Plane.getEPSILON());
189-
205+
if(!arePointsCoplanar(vertices,plane.getNormal())) {
206+
this.plane = Plane.createFromPoints(vertices);
207+
if(!arePointsCoplanar(vertices,plane.getNormal()))
208+
throw new RuntimeException("All points are not on plane of epsilon "+Plane.getEPSILON());
209+
}
190210
setDegenerate(false);
191211

192212
}
@@ -295,7 +315,7 @@ public Polygon clone() {
295315
this.vertices.forEach((vertex) -> {
296316
newVertices.add(vertex.clone());
297317
});
298-
return new Polygon(newVertices, getStorage(), true).setColor(color);
318+
return new Polygon(newVertices, getStorage(), true, this.plane).setColor(color);
299319
}
300320

301321
/**

0 commit comments

Comments
 (0)