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.renderer.raster.shapes.basic.texturedpolygon.TexturedPolygon;
9 import java.util.ArrayList;
10 import java.util.List;
12 import static java.util.Arrays.sort;
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.
21 private final double maxDistance;
26 private final List<TexturedPolygon> result = new ArrayList<>();
28 public Slicer(final double maxDistance) {
29 this.maxDistance = maxDistance;
32 private void considerSlicing(final PolygonCoordinate c1,
33 final PolygonCoordinate c2,
34 final PolygonCoordinate c3,
35 final TexturedPolygon originalPolygon) {
37 final BorderLine[] lines = new BorderLine[]{
38 new BorderLine(c1, c2, 1), new BorderLine(c2, c3, 2),
39 new BorderLine(c3, c1, 3)};
41 sort(lines, lines[0]);
43 final BorderLine longestLine = lines[2];
45 if (longestLine.getLength() < maxDistance) {
46 final TexturedPolygon polygon = new TexturedPolygon(c1, c2, c3,
47 originalPolygon.texture);
49 polygon.setMouseInteractionController(originalPolygon.mouseInteractionController);
51 getResult().add(polygon);
55 final PolygonCoordinate middle = longestLine.getMiddlePoint();
57 switch (longestLine.count) {
59 considerSlicing(c1, middle, c3, originalPolygon);
60 considerSlicing(middle, c2, c3, originalPolygon);
63 considerSlicing(c1, c2, middle, originalPolygon);
64 considerSlicing(middle, c3, c1, originalPolygon);
67 considerSlicing(c1, c2, middle, originalPolygon);
68 considerSlicing(middle, c2, c3, originalPolygon);
73 public List<TexturedPolygon> getResult() {
77 public void slice(final TexturedPolygon originalPolygon) {
79 final PolygonCoordinate pc1 = new PolygonCoordinate(
80 originalPolygon.coordinates[0].coordinate,
81 originalPolygon.texturePoint1);
83 final PolygonCoordinate pc2 = new PolygonCoordinate(
84 originalPolygon.coordinates[1].coordinate,
85 originalPolygon.texturePoint2);
87 final PolygonCoordinate pc3 = new PolygonCoordinate(
88 originalPolygon.coordinates[2].coordinate,
89 originalPolygon.texturePoint3);
91 considerSlicing(pc1, pc2, pc3, originalPolygon);