Fixed git clone URL
[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.math.Vertex;
8 import eu.svjatoslav.sixth.e3d.renderer.raster.shapes.basic.texturedpolygon.TexturedPolygon;
9
10 import java.util.ArrayList;
11 import java.util.List;
12
13 import static java.util.Arrays.sort;
14
15 public class Slicer {
16
17     /**
18      * Maximum distance between two points.
19      * If the distance is greater than this value, the polygon will be sliced.
20      * Otherwise, it will be added to the result.
21      */
22     private final double maxDistance;
23
24     /**
25      * Result of slicing.
26      */
27     private final List<TexturedPolygon> result = new ArrayList<>();
28
29     public Slicer(final double maxDistance) {
30         this.maxDistance = maxDistance;
31     }
32
33     private void considerSlicing(final Vertex c1,
34                                  final Vertex c2,
35                                  final Vertex c3,
36                                  final TexturedPolygon originalPolygon) {
37
38         final BorderLine[] lines = new BorderLine[]{
39                 new BorderLine(c1, c2, 1), new BorderLine(c2, c3, 2),
40                 new BorderLine(c3, c1, 3)};
41
42         sort(lines, lines[0]);
43
44         final BorderLine longestLine = lines[2];
45
46         if (longestLine.getLength() < maxDistance) {
47             final TexturedPolygon polygon = new TexturedPolygon(c1, c2, c3,
48                     originalPolygon.texture);
49
50             polygon.setMouseInteractionController(originalPolygon.mouseInteractionController);
51
52             getResult().add(polygon);
53             return;
54         }
55
56         final Vertex middle = longestLine.getMiddlePoint();
57
58         switch (longestLine.count) {
59             case 1:
60                 considerSlicing(c1, middle, c3, originalPolygon);
61                 considerSlicing(middle, c2, c3, originalPolygon);
62                 return;
63             case 2:
64                 considerSlicing(c1, c2, middle, originalPolygon);
65                 considerSlicing(middle, c3, c1, originalPolygon);
66                 return;
67             case 3:
68                 considerSlicing(c1, c2, middle, originalPolygon);
69                 considerSlicing(middle, c2, c3, originalPolygon);
70         }
71
72     }
73
74     public List<TexturedPolygon> getResult() {
75         return result;
76     }
77
78     public void slice(final TexturedPolygon originalPolygon) {
79
80         considerSlicing(
81                 originalPolygon.coordinates[0],
82                 originalPolygon.coordinates[1],
83                 originalPolygon.coordinates[2],
84                 originalPolygon);
85     }
86
87 }