2 * Sixth 3D engine. Copyright ©2012-2016, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
4 * This program is free software; you can redistribute it and/or
5 * modify it under the terms of version 3 of the GNU Lesser General Public License
6 * or later as published by the Free Software Foundation.
10 package eu.svjatoslav.sixth.e3d.renderer.raster.slicer;
12 import eu.svjatoslav.sixth.e3d.renderer.raster.shapes.basic.texturedpolygon.TexturedPolygon;
14 import java.util.ArrayList;
15 import java.util.Arrays;
16 import java.util.List;
20 private final double maxDistance;
21 private final List<TexturedPolygon> result = new ArrayList<>();
23 public Slicer(final double maxDistance) {
24 this.maxDistance = maxDistance;
27 private void considerSlicing(final PolygonCoordinate c1,
28 final PolygonCoordinate c2, final PolygonCoordinate c3,
29 final TexturedPolygon originalPolygon) {
31 final BorderLine lines[] = new BorderLine[]{
32 new BorderLine(c1, c2, 1), new BorderLine(c2, c3, 2),
33 new BorderLine(c3, c1, 3)};
35 Arrays.sort(lines, lines[0]);
37 final BorderLine longestLine = lines[2];
39 if (longestLine.getLength() < maxDistance) {
40 final TexturedPolygon polygon = new TexturedPolygon(c1, c2, c3,
41 originalPolygon.texture);
43 polygon.setMouseInteractionController(originalPolygon.mouseInteractionController);
45 getResult().add(polygon);
49 final PolygonCoordinate middle = longestLine.getMiddlePoint();
51 switch (longestLine.count) {
53 considerSlicing(c1, middle, c3, originalPolygon);
54 considerSlicing(middle, c2, c3, originalPolygon);
57 considerSlicing(c1, c2, middle, originalPolygon);
58 considerSlicing(middle, c3, c1, originalPolygon);
61 considerSlicing(c1, c2, middle, originalPolygon);
62 considerSlicing(middle, c2, c3, originalPolygon);
67 public List<TexturedPolygon> getResult() {
71 public void slice(final TexturedPolygon originalPolygon) {
73 final PolygonCoordinate pc1 = new PolygonCoordinate(
74 originalPolygon.coordinates[0].coordinate,
75 originalPolygon.texturePoint1);
77 final PolygonCoordinate pc2 = new PolygonCoordinate(
78 originalPolygon.coordinates[1].coordinate,
79 originalPolygon.texturePoint2);
81 final PolygonCoordinate pc3 = new PolygonCoordinate(
82 originalPolygon.coordinates[2].coordinate,
83 originalPolygon.texturePoint3);
85 considerSlicing(pc1, pc2, pc3, originalPolygon);