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.Arrays;
11 import java.util.List;
15 private final double maxDistance;
16 private final List<TexturedPolygon> result = new ArrayList<>();
18 public Slicer(final double maxDistance) {
19 this.maxDistance = maxDistance;
22 private void considerSlicing(final PolygonCoordinate c1,
23 final PolygonCoordinate c2, final PolygonCoordinate c3,
24 final TexturedPolygon originalPolygon) {
26 final BorderLine lines[] = new BorderLine[]{
27 new BorderLine(c1, c2, 1), new BorderLine(c2, c3, 2),
28 new BorderLine(c3, c1, 3)};
30 Arrays.sort(lines, lines[0]);
32 final BorderLine longestLine = lines[2];
34 if (longestLine.getLength() < maxDistance) {
35 final TexturedPolygon polygon = new TexturedPolygon(c1, c2, c3,
36 originalPolygon.texture);
38 polygon.setMouseInteractionController(originalPolygon.mouseInteractionController);
40 getResult().add(polygon);
44 final PolygonCoordinate middle = longestLine.getMiddlePoint();
46 switch (longestLine.count) {
48 considerSlicing(c1, middle, c3, originalPolygon);
49 considerSlicing(middle, c2, c3, originalPolygon);
52 considerSlicing(c1, c2, middle, originalPolygon);
53 considerSlicing(middle, c3, c1, originalPolygon);
56 considerSlicing(c1, c2, middle, originalPolygon);
57 considerSlicing(middle, c2, c3, originalPolygon);
62 public List<TexturedPolygon> getResult() {
66 public void slice(final TexturedPolygon originalPolygon) {
68 final PolygonCoordinate pc1 = new PolygonCoordinate(
69 originalPolygon.coordinates[0].coordinate,
70 originalPolygon.texturePoint1);
72 final PolygonCoordinate pc2 = new PolygonCoordinate(
73 originalPolygon.coordinates[1].coordinate,
74 originalPolygon.texturePoint2);
76 final PolygonCoordinate pc3 = new PolygonCoordinate(
77 originalPolygon.coordinates[2].coordinate,
78 originalPolygon.texturePoint3);
80 considerSlicing(pc1, pc2, pc3, originalPolygon);