34 package eu.mihosoft.vrl.v3d;
36 import java.util.ArrayList;
37 import java.util.List;
38 import java.util.stream.Collectors;
39 import java.util.stream.Stream;
54 private List<Polygon> polygons;
68 private long maxDepth = -1;
77 public Node(List<Polygon> polygons) {
78 this.polygons =
new ArrayList<>();
79 if (polygons !=
null) {
98 Node node =
new Node();
99 node.plane = this.plane ==
null ? null : this.plane.clone();
100 node.front = this.front ==
null ? null : this.front.clone();
101 node.back = this.back ==
null ? null : this.back.clone();
107 Stream<Polygon> polygonStream;
109 if (polygons.size() > 200) {
110 polygonStream = polygons.parallelStream();
112 polygonStream = polygons.stream();
114 node.polygons = polygonStream.map(p -> p.clone()).collect(Collectors.toList());
122 public void invert() {
124 Stream<Polygon> polygonStream;
126 if (polygons.size() > 200) {
127 polygonStream = polygons.parallelStream();
129 polygonStream = polygons.stream();
131 polygonStream.forEach((polygon) -> {
135 if (this.plane ==
null && !polygons.isEmpty()) {
136 this.plane = polygons.get(0).plane.clone();
137 }
else if (this.plane ==
null && polygons.isEmpty()) {
140 throw new RuntimeException(
"Please fix me! I don't know what to do?");
146 if (this.front !=
null) {
149 if (this.back !=
null) {
152 Node temp = this.front;
153 this.front = this.back;
167 private List<Polygon> clipPolygons(List<Polygon> polygons) {
169 if (this.plane ==
null) {
170 return new ArrayList<>(polygons);
173 List<Polygon> frontP =
new ArrayList<>();
174 List<Polygon> backP =
new ArrayList<>();
176 for (Polygon polygon : polygons) {
177 this.plane.splitPolygon(polygon, frontP, backP, frontP, backP);
179 if (this.front !=
null) {
180 frontP = this.front.clipPolygons(frontP);
182 if (this.back !=
null) {
183 backP = this.back.clipPolygons(backP);
185 backP =
new ArrayList<>(0);
188 frontP.addAll(backP);
202 public void clipTo(Node bsp) {
203 this.polygons = bsp.clipPolygons(this.polygons);
204 if (this.front !=
null) {
205 this.front.clipTo(bsp);
207 if (this.back !=
null) {
208 this.back.clipTo(bsp);
217 public List<Polygon> allPolygons() {
218 List<Polygon> localPolygons =
new ArrayList<>(this.polygons);
219 if (this.front !=
null) {
220 localPolygons.addAll(this.front.allPolygons());
223 if (this.back !=
null) {
225 localPolygons.addAll(this.back.allPolygons());
228 return localPolygons;
239 public final void build(List<Polygon> polygons) {
240 build(polygons, 0,polygons.size() );
251 public final void build(List<Polygon> polygons,
long depth,
long maxDepth) {
262 if (polygons.isEmpty()) {
267 if (this.plane ==
null) {
268 this.plane = polygons.get(0).plane.clone();
272 List<Polygon> frontP =
new ArrayList<>();
273 List<Polygon> backP =
new ArrayList<>();
276 for(
int i=0;i<polygons.size();i++) {
277 this.plane.splitPolygon(polygons.get(i),
this.polygons,
this.polygons, frontP, backP);
279 if (frontP.size() > 0) {
280 if (this.front ==
null) {
281 this.front =
new Node();
283 this.front.build(frontP, depth + 1,maxDepth);
285 if (backP.size() > 0) {
286 if (this.back ==
null) {
287 this.back =
new Node();
289 this.back.build(backP, depth + 1,maxDepth);