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