Improved code readability
[sixth-3d.git] / src / main / java / eu / svjatoslav / sixth / e3d / renderer / raster / slicer / Slicer.java
1 /*
2  * Sixth 3D engine. Author: Svjatoslav Agejenko.
3  * This project is released under Creative Commons Zero (CC0) license.
4  */
5 package eu.svjatoslav.sixth.e3d.renderer.raster.slicer;
6
7 import eu.svjatoslav.sixth.e3d.renderer.raster.shapes.basic.texturedpolygon.TexturedPolygon;
8
9 import java.util.ArrayList;
10 import java.util.List;
11
12 import static java.util.Arrays.sort;
13
14 public class Slicer {
15
16     /**
17      * Maximum distance between two points.
18      * If the distance is greater than this value, the polygon will be sliced.
19      * Otherwise, it will be added to the result.
20      */
21     private final double maxDistance;
22
23     /**
24      * Result of slicing.
25      */
26     private final List<TexturedPolygon> result = new ArrayList<>();
27
28     public Slicer(final double maxDistance) {
29         this.maxDistance = maxDistance;
30     }
31
32     private void considerSlicing(final PolygonCoordinate c1,
33                                  final PolygonCoordinate c2,
34                                  final PolygonCoordinate c3,
35                                  final TexturedPolygon originalPolygon) {
36
37         final BorderLine[] lines = new BorderLine[]{
38                 new BorderLine(c1, c2, 1), new BorderLine(c2, c3, 2),
39                 new BorderLine(c3, c1, 3)};
40
41         sort(lines, lines[0]);
42
43         final BorderLine longestLine = lines[2];
44
45         if (longestLine.getLength() < maxDistance) {
46             final TexturedPolygon polygon = new TexturedPolygon(c1, c2, c3,
47                     originalPolygon.texture);
48
49             polygon.setMouseInteractionController(originalPolygon.mouseInteractionController);
50
51             getResult().add(polygon);
52             return;
53         }
54
55         final PolygonCoordinate middle = longestLine.getMiddlePoint();
56
57         switch (longestLine.count) {
58             case 1:
59                 considerSlicing(c1, middle, c3, originalPolygon);
60                 considerSlicing(middle, c2, c3, originalPolygon);
61                 return;
62             case 2:
63                 considerSlicing(c1, c2, middle, originalPolygon);
64                 considerSlicing(middle, c3, c1, originalPolygon);
65                 return;
66             case 3:
67                 considerSlicing(c1, c2, middle, originalPolygon);
68                 considerSlicing(middle, c2, c3, originalPolygon);
69         }
70
71     }
72
73     public List<TexturedPolygon> getResult() {
74         return result;
75     }
76
77     public void slice(final TexturedPolygon originalPolygon) {
78
79         final PolygonCoordinate pc1 = new PolygonCoordinate(
80                 originalPolygon.coordinates[0].coordinate,
81                 originalPolygon.texturePoint1);
82
83         final PolygonCoordinate pc2 = new PolygonCoordinate(
84                 originalPolygon.coordinates[1].coordinate,
85                 originalPolygon.texturePoint2);
86
87         final PolygonCoordinate pc3 = new PolygonCoordinate(
88                 originalPolygon.coordinates[2].coordinate,
89                 originalPolygon.texturePoint3);
90
91         considerSlicing(pc1, pc2, pc3, originalPolygon);
92     }
93
94 }