2 * Sixth 3D engine. Author: Svjatoslav Agejenko.
3 * This project is released under Creative Commons Zero (CC0) license.
5 package eu.svjatoslav.sixth.e3d.renderer.raster.slicer;
7 import eu.svjatoslav.sixth.e3d.math.Vertex;
8 import eu.svjatoslav.sixth.e3d.renderer.raster.shapes.basic.texturedpolygon.TexturedPolygon;
10 import java.util.ArrayList;
11 import java.util.List;
13 import static java.util.Arrays.sort;
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.
22 private final double maxDistance;
27 private final List<TexturedPolygon> result = new ArrayList<>();
29 public Slicer(final double maxDistance) {
30 this.maxDistance = maxDistance;
33 private void considerSlicing(final Vertex c1,
36 final TexturedPolygon originalPolygon) {
38 final BorderLine[] lines = new BorderLine[]{
39 new BorderLine(c1, c2, 1), new BorderLine(c2, c3, 2),
40 new BorderLine(c3, c1, 3)};
42 sort(lines, lines[0]);
44 final BorderLine longestLine = lines[2];
46 if (longestLine.getLength() < maxDistance) {
47 final TexturedPolygon polygon = new TexturedPolygon(c1, c2, c3,
48 originalPolygon.texture);
50 polygon.setMouseInteractionController(originalPolygon.mouseInteractionController);
52 getResult().add(polygon);
56 final Vertex middle = longestLine.getMiddlePoint();
58 switch (longestLine.count) {
60 considerSlicing(c1, middle, c3, originalPolygon);
61 considerSlicing(middle, c2, c3, originalPolygon);
64 considerSlicing(c1, c2, middle, originalPolygon);
65 considerSlicing(middle, c3, c1, originalPolygon);
68 considerSlicing(c1, c2, middle, originalPolygon);
69 considerSlicing(middle, c2, c3, originalPolygon);
74 public List<TexturedPolygon> getResult() {
78 public void slice(final TexturedPolygon originalPolygon) {
81 originalPolygon.coordinates[0],
82 originalPolygon.coordinates[1],
83 originalPolygon.coordinates[2],