Formatting update
[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.Arrays;
11 import java.util.List;
12
13 public class Slicer {
14
15     private final double maxDistance;
16     private final List<TexturedPolygon> result = new ArrayList<>();
17
18     public Slicer(final double maxDistance) {
19         this.maxDistance = maxDistance;
20     }
21
22     private void considerSlicing(final PolygonCoordinate c1,
23                                  final PolygonCoordinate c2, final PolygonCoordinate c3,
24                                  final TexturedPolygon originalPolygon) {
25
26         final BorderLine lines[] = new BorderLine[]{
27                 new BorderLine(c1, c2, 1), new BorderLine(c2, c3, 2),
28                 new BorderLine(c3, c1, 3)};
29
30         Arrays.sort(lines, lines[0]);
31
32         final BorderLine longestLine = lines[2];
33
34         if (longestLine.getLength() < maxDistance) {
35             final TexturedPolygon polygon = new TexturedPolygon(c1, c2, c3,
36                     originalPolygon.texture);
37
38             polygon.setMouseInteractionController(originalPolygon.mouseInteractionController);
39
40             getResult().add(polygon);
41             return;
42         }
43
44         final PolygonCoordinate middle = longestLine.getMiddlePoint();
45
46         switch (longestLine.count) {
47             case 1:
48                 considerSlicing(c1, middle, c3, originalPolygon);
49                 considerSlicing(middle, c2, c3, originalPolygon);
50                 return;
51             case 2:
52                 considerSlicing(c1, c2, middle, originalPolygon);
53                 considerSlicing(middle, c3, c1, originalPolygon);
54                 return;
55             case 3:
56                 considerSlicing(c1, c2, middle, originalPolygon);
57                 considerSlicing(middle, c2, c3, originalPolygon);
58         }
59
60     }
61
62     public List<TexturedPolygon> getResult() {
63         return result;
64     }
65
66     public void slice(final TexturedPolygon originalPolygon) {
67
68         final PolygonCoordinate pc1 = new PolygonCoordinate(
69                 originalPolygon.coordinates[0].coordinate,
70                 originalPolygon.texturePoint1);
71
72         final PolygonCoordinate pc2 = new PolygonCoordinate(
73                 originalPolygon.coordinates[1].coordinate,
74                 originalPolygon.texturePoint2);
75
76         final PolygonCoordinate pc3 = new PolygonCoordinate(
77                 originalPolygon.coordinates[2].coordinate,
78                 originalPolygon.texturePoint3);
79
80         considerSlicing(pc1, pc2, pc3, originalPolygon);
81     }
82
83 }