From 73163508e92e8a010964bc469194b299eccfa02d Mon Sep 17 00:00:00 2001 From: Brook333 Date: Wed, 12 Jun 2019 04:26:43 +0300 Subject: [PATCH 1/2] feat(object): add polygon object --- .../lab5/geometry/Triangulation.java | 25 ++++ .../lab5/geometry/Vector3.java | 5 + .../lab5/io/obj/ObjReader.java | 8 ++ .../lab5/io/obj/ParseObjFile.java | 117 +++++++++++++++ .../lab5/io/obj/Polygon.java | 24 ++++ .../lab5/io/obj/Vertex.java | 16 +++ .../lab5/object/OptimizedObject.java | 3 + .../lab5/object/Parser/ParseObjFile.java | 135 ------------------ .../lab5/object/Parser/Polygon.java | 41 ------ .../lab5/object/Parser/PolygonObject.java | 25 ---- .../lab5/object/Parser/StringUtils.java | 42 ------ .../lab5/object/Parser/Vertex.java | 31 ---- .../lab5/object/PolygonObject.java | 39 +++++ .../lab5/object/Parser/ParseObjFileTest.java | 11 +- .../lab5/object/Parser/StringUtilsTest.java | 19 --- .../lab5/object/Parser/VertexTest.java | 11 +- 16 files changed, 245 insertions(+), 307 deletions(-) create mode 100644 src/main/java/labs/introtoprogramming/lab5/geometry/Triangulation.java create mode 100644 src/main/java/labs/introtoprogramming/lab5/io/obj/ParseObjFile.java create mode 100644 src/main/java/labs/introtoprogramming/lab5/io/obj/Polygon.java create mode 100644 src/main/java/labs/introtoprogramming/lab5/io/obj/Vertex.java delete mode 100644 src/main/java/labs/introtoprogramming/lab5/object/Parser/ParseObjFile.java delete mode 100644 src/main/java/labs/introtoprogramming/lab5/object/Parser/Polygon.java delete mode 100644 src/main/java/labs/introtoprogramming/lab5/object/Parser/PolygonObject.java delete mode 100644 src/main/java/labs/introtoprogramming/lab5/object/Parser/StringUtils.java delete mode 100644 src/main/java/labs/introtoprogramming/lab5/object/Parser/Vertex.java create mode 100644 src/main/java/labs/introtoprogramming/lab5/object/PolygonObject.java delete mode 100644 src/test/java/labs/introtoprogramming/lab5/object/Parser/StringUtilsTest.java diff --git a/src/main/java/labs/introtoprogramming/lab5/geometry/Triangulation.java b/src/main/java/labs/introtoprogramming/lab5/geometry/Triangulation.java new file mode 100644 index 0000000..549de28 --- /dev/null +++ b/src/main/java/labs/introtoprogramming/lab5/geometry/Triangulation.java @@ -0,0 +1,25 @@ +package labs.introtoprogramming.lab5.geometry; + +import labs.introtoprogramming.lab5.io.obj.Polygon; +import labs.introtoprogramming.lab5.io.obj.Vertex; +import labs.introtoprogramming.lab5.object.Triangle; +import labs.introtoprogramming.lab5.scene.Transform; + +import java.util.ArrayList; +import java.util.List; + +public class Triangulation { + + public List splitPolygons(List polygons) { + List triangles = new ArrayList<>(); + for (Polygon pol : polygons) { + List ver = pol.getVertices(); + Vector3 pillar = ver.get(0).geometry; + for (int i = 0; i < ver.size() - 1; i++) { + triangles.add(new Triangle(new Transform(), + pillar, ver.get(i).geometry, ver.get(i + 1).geometry)); + } + } + return triangles; + } +} diff --git a/src/main/java/labs/introtoprogramming/lab5/geometry/Vector3.java b/src/main/java/labs/introtoprogramming/lab5/geometry/Vector3.java index ddda264..dd44d0e 100644 --- a/src/main/java/labs/introtoprogramming/lab5/geometry/Vector3.java +++ b/src/main/java/labs/introtoprogramming/lab5/geometry/Vector3.java @@ -92,4 +92,9 @@ public int hashCode() { public Object clone() throws CloneNotSupportedException { return super.clone(); } + + @Override + public String toString() { + return x + " : " + y + " : " + z; + } } diff --git a/src/main/java/labs/introtoprogramming/lab5/io/obj/ObjReader.java b/src/main/java/labs/introtoprogramming/lab5/io/obj/ObjReader.java index 76d29cc..e180fe2 100644 --- a/src/main/java/labs/introtoprogramming/lab5/io/obj/ObjReader.java +++ b/src/main/java/labs/introtoprogramming/lab5/io/obj/ObjReader.java @@ -1,4 +1,12 @@ package labs.introtoprogramming.lab5.io.obj; +import labs.introtoprogramming.lab5.object.Triangle; + +import java.io.IOException; +import java.io.InputStream; +import java.util.List; + public interface ObjReader { + void load(InputStream is) throws IOException; + List getPolygons(); } diff --git a/src/main/java/labs/introtoprogramming/lab5/io/obj/ParseObjFile.java b/src/main/java/labs/introtoprogramming/lab5/io/obj/ParseObjFile.java new file mode 100644 index 0000000..a33a1a9 --- /dev/null +++ b/src/main/java/labs/introtoprogramming/lab5/io/obj/ParseObjFile.java @@ -0,0 +1,117 @@ +package labs.introtoprogramming.lab5.io.obj; + +import labs.introtoprogramming.lab5.geometry.Triangulation; +import labs.introtoprogramming.lab5.geometry.Vector3; +import labs.introtoprogramming.lab5.object.PolygonObject; +import labs.introtoprogramming.lab5.object.Triangle; +import labs.introtoprogramming.lab5.scene.SceneObject; +import labs.introtoprogramming.lab5.scene.Transform; + +import java.io.*; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; + +public class ParseObjFile implements ObjReader { + /** + * String indicators of parameter in .obj file. + */ + private final static String OBJ_VERTEX_NORMAL = "vn"; + private final static String OBJ_VERTEX = "v"; + private final static String OBJ_FACE = "f"; + private List verticesNormals = new ArrayList<>(); + private List verticesGeometry = new ArrayList<>(); + private List polygons = new ArrayList<>(); + private Triangulation triangulation = new Triangulation(); + + /** + * This is part to parse object file + * @param is + * @throws FileNotFoundException + * @throws IOException + */ + public void load(InputStream is) throws IOException { + InputStreamReader fileReader; + BufferedReader bufferedReader; + fileReader = new InputStreamReader(is, StandardCharsets.UTF_8); + bufferedReader = new BufferedReader(fileReader); + String line; + + // read .obj file + while ((line = bufferedReader.readLine()) != null) { + line = line.trim(); + + if (line.isEmpty()) { + continue; + } + + // cases to process + if (line.startsWith(OBJ_VERTEX_NORMAL)) { + processVertexNormal(line); + // add vertex with some coordinates + } else if (line.startsWith(OBJ_VERTEX)) { + processVertex(line); + } else if (line.startsWith(OBJ_FACE)) { + processFace(line); + } + } + bufferedReader.close(); + } + + public List getPolygons() { + return triangulation.splitPolygons(polygons); + } + /** + * Create vertex( just coordinates of each one) from data of file. + * @param line + */ + private void processVertex(String line) { + String[] values = line.replaceAll("\\s+", " ").split(" "); + double[] result = new double[3]; + for (int i = 1; i < values.length; i++) { + result[i - 1] = Double.parseDouble(values[i]); + } + verticesGeometry.add(new Vector3(result[0], result[1], result[2])); + } + /** + * Create normal-data of vertex + * @param line + */ + private void processVertexNormal(String line) { + String[] values = line.replaceAll("\\s+", " ").split(" "); + double[] result = new double[3]; + for (int i = 1; i < values.length; i++) { + result[i - 1] = Double.parseDouble(values[i]); + } + verticesNormals.add(new Vector3(result[0], result[1], result[2])); + } + + + private void processFace(String line) { + line = line.substring(OBJ_FACE.length()).trim(); + polygons.add(parseCodeLine(line)); + } + + private Polygon parseCodeLine(String list) { + if (list == null) { + return null; + } + if (list.equals("")) { + return null; + } + String[] vertexStrings = list.split(" "); + List vertices = new ArrayList<>(); + + for (int i = 0; i < vertexStrings.length; i++) { + String[] temp = vertexStrings[i].split("/"); + Vector3 geometry = verticesGeometry.get(Integer.parseInt(temp[0])); + int index = -1; + if (temp.length == 3) { + index = Integer.parseInt(temp[2]); + } + Vector3 normal = index == -1 ? Vector3.ZERO : verticesNormals.get(index); + vertices.add(new Vertex(geometry, normal)); + } + return new Polygon(vertices); + } +} diff --git a/src/main/java/labs/introtoprogramming/lab5/io/obj/Polygon.java b/src/main/java/labs/introtoprogramming/lab5/io/obj/Polygon.java new file mode 100644 index 0000000..17673f5 --- /dev/null +++ b/src/main/java/labs/introtoprogramming/lab5/io/obj/Polygon.java @@ -0,0 +1,24 @@ +package labs.introtoprogramming.lab5.io.obj; + +import java.util.List; + +public class Polygon { + private List vertices; + + public Polygon(List vertices) { + this.vertices = vertices; + } + + public List getVertices() { + return vertices; + } + + public String toString() { + StringBuilder s = new StringBuilder(); + for (Vertex v : vertices) { + s.append(v.geometry.toString()) + .append(" || "); + } + return s.toString(); + } +} \ No newline at end of file diff --git a/src/main/java/labs/introtoprogramming/lab5/io/obj/Vertex.java b/src/main/java/labs/introtoprogramming/lab5/io/obj/Vertex.java new file mode 100644 index 0000000..79ba932 --- /dev/null +++ b/src/main/java/labs/introtoprogramming/lab5/io/obj/Vertex.java @@ -0,0 +1,16 @@ +package labs.introtoprogramming.lab5.io.obj; + +import labs.introtoprogramming.lab5.geometry.Vector3; + +public class Vertex { + /** + * Vertex parameters: geometry coordinates and coordinates of normals + */ + public Vector3 geometry; + public Vector3 normal; + + public Vertex(Vector3 geometry, Vector3 normal) { + this.geometry = geometry; + this.normal = normal; + } +} diff --git a/src/main/java/labs/introtoprogramming/lab5/object/OptimizedObject.java b/src/main/java/labs/introtoprogramming/lab5/object/OptimizedObject.java index 1415279..d1b288b 100644 --- a/src/main/java/labs/introtoprogramming/lab5/object/OptimizedObject.java +++ b/src/main/java/labs/introtoprogramming/lab5/object/OptimizedObject.java @@ -12,6 +12,9 @@ public class OptimizedObject extends SceneObject { public OptimizedObject(Transform transform, List objects) { super(transform); + for (SceneObject obj : objects) { + obj.getTransform().setParent(transform); + } tree = new KDTree(objects); } diff --git a/src/main/java/labs/introtoprogramming/lab5/object/Parser/ParseObjFile.java b/src/main/java/labs/introtoprogramming/lab5/object/Parser/ParseObjFile.java deleted file mode 100644 index 33b0ed1..0000000 --- a/src/main/java/labs/introtoprogramming/lab5/object/Parser/ParseObjFile.java +++ /dev/null @@ -1,135 +0,0 @@ -package labs.introtoprogramming.lab5.object.Parser; - -import labs.introtoprogramming.lab5.geometry.Vector3; - -import java.io.*; -import java.util.ArrayList; -import java.util.List; -import java.util.logging.Logger; - -import static java.util.logging.Level.INFO; -import static java.util.logging.Level.WARNING; - -public class ParseObjFile { - private Logger log = Logger.getLogger(ParseObjFile.class.getName()); - /** - * String indicators of parameter in .obj file. - */ - private final static String OBJ_VERTEX_NORMAL = "vn"; - private final static String OBJ_VERTEX = "v"; - private final static String OBJ_FACE = "f"; - private List verticesNormals = new ArrayList<>(); - private List verticesGeometry = new ArrayList<>(); - private PolygonObject polygonObject = null; - - public ParseObjFile(InputStream is) throws FileNotFoundException, IOException { - polygonObject = new PolygonObject(); - parseObjFile(is); - } - /** - * This is part to parse object file - * @param is - * @throws FileNotFoundException - * @throws IOException - */ - private void parseObjFile(InputStream is) throws IOException { - int lineCount = 0; - InputStreamReader fileReader; - BufferedReader bufferedReader; - fileReader = new InputStreamReader(is, "UTF-8"); - bufferedReader = new BufferedReader(fileReader); - String line; - - // read .obj file - while ((line = bufferedReader.readLine()) != null) { - line = line.trim(); - - if (line.length() == 0) { - continue; - } - - // cases to process - if (line.startsWith("#")) { - continue; - } else if (line.startsWith(OBJ_VERTEX_NORMAL)) { - processVertexNormal(line); - // add vertex with some coordinates - } else if (line.startsWith(OBJ_VERTEX)) { - processVertex(line); - } else if (line.startsWith(OBJ_FACE)) { - processFace(line); - } else { - log.log(WARNING, "line " + lineCount + " unknown line |" + line + "|"); - } - lineCount++; - } - bufferedReader.close(); - - log.log(INFO, "Loaded " + lineCount + " lines"); - } - - public PolygonObject getPolygonObject() { - return polygonObject; - } - /** - * Create vertex( just coordinates of each one) from data of file. - * @param line - */ - private void processVertex(String line) { - String[] values = line.split(" "); - float[] result = new float[3]; - for (int i = 2; i < values.length; i++) { - result[i - 2] = Float.parseFloat(values[i]); - } - verticesGeometry.add(new Vector3(result[0], result[1], result[2])); - } - /** - * Create normal-data of vertex - * @param line - */ - private void processVertexNormal(String line) { - String[] values = line.split(" "); - float[] result = new float[3]; - for (int i = 2; i < values.length; i++) { - result[i - 2] = Float.parseFloat(values[i]); - } - verticesNormals.add(new Vector3(result[0], result[1], result[2])); - } - - - private void processFace(String line) { - line = line.substring(OBJ_FACE.length()).trim(); - Integer[] vertexIndexAry = StringUtils.parseCodeLine(line); - addPolygon(vertexIndexAry); - } - - public void addPolygon(Integer[] vertexIndices) { - Polygon polygon = new Polygon(); - - int indexOfStructure = 0; - Vertex fv; - - while (indexOfStructure + 2 < vertexIndices.length) { - - fv = new Vertex(); - fv.setVertexG(verticesGeometry.get(vertexIndices[indexOfStructure] - 1)); - if (vertexIndices[indexOfStructure + 2] != null) { - indexOfStructure++; - } - fv.setVertexN(verticesNormals.get(vertexIndices[++indexOfStructure] - 1)); - polygonObject.addVertex(fv); - polygon.addVertex(fv); - indexOfStructure += 2; - } - polygon.calculatePolygonNormalTriangle(); - polygonObject.addPolygon(polygon); - } - - public List getVerticesNormals() { - return verticesNormals; - } - - public List getVerticesGeometry() { - return verticesGeometry; - } -} diff --git a/src/main/java/labs/introtoprogramming/lab5/object/Parser/Polygon.java b/src/main/java/labs/introtoprogramming/lab5/object/Parser/Polygon.java deleted file mode 100644 index 5ddb5b8..0000000 --- a/src/main/java/labs/introtoprogramming/lab5/object/Parser/Polygon.java +++ /dev/null @@ -1,41 +0,0 @@ -package labs.introtoprogramming.lab5.object.Parser; - -import labs.introtoprogramming.lab5.geometry.Vector3; - -import java.util.ArrayList; -import java.util.List; - -public class Polygon { - private List vertices = new ArrayList<>(); - private Vector3 polygonNormal; - public List getVertices() { - return vertices; - } - - public void setVertecies(ArrayList vertices) { - this.vertices = vertices; - } - - public void addVertex(Vertex vertex) {vertices.add(vertex);} - - public void setVertices(ArrayList vertices) { - this.vertices = vertices; - } - - public Vector3 getPolygonNormal() { - return polygonNormal; - } - - public void calculatePolygonNormalTriangle() { - if (vertices.size() == 3) { - - Vector3 fromOneToTwo = vertices.get(0).getVertexG().subtract(vertices.get(1).getVertexG()); - Vector3 fromOneToThree = vertices.get(0).getVertexG().subtract(vertices.get(2).getVertexG()); - polygonNormal = fromOneToTwo.crossProduct(fromOneToThree); - } - } - - public void setPolygonNormal(Vector3 polygonNormal) { - this.polygonNormal = polygonNormal; - } -} \ No newline at end of file diff --git a/src/main/java/labs/introtoprogramming/lab5/object/Parser/PolygonObject.java b/src/main/java/labs/introtoprogramming/lab5/object/Parser/PolygonObject.java deleted file mode 100644 index 0374fe5..0000000 --- a/src/main/java/labs/introtoprogramming/lab5/object/Parser/PolygonObject.java +++ /dev/null @@ -1,25 +0,0 @@ -package labs.introtoprogramming.lab5.object.Parser; - -import labs.introtoprogramming.lab5.scene.SceneObject; - -import java.util.ArrayList; -import java.util.List; - -public class PolygonObject extends SceneObject { - private List vertices = new ArrayList<>(); - private List polygons = new ArrayList<>(); - public List getVertices() { - return vertices; - } - public List getPolygons() { - return polygons; - } - - public void addVertex(Vertex vertex) { - vertices.add(vertex); - } - - public void addPolygon(Polygon polygon) { - polygons.add(polygon); - } -} diff --git a/src/main/java/labs/introtoprogramming/lab5/object/Parser/StringUtils.java b/src/main/java/labs/introtoprogramming/lab5/object/Parser/StringUtils.java deleted file mode 100644 index ecc6dd2..0000000 --- a/src/main/java/labs/introtoprogramming/lab5/object/Parser/StringUtils.java +++ /dev/null @@ -1,42 +0,0 @@ -package labs.introtoprogramming.lab5.object.Parser; - -import java.util.logging.Logger; - -public class StringUtils { - private static Logger log = Logger.getLogger(StringUtils.class.getName()); - - public static Integer[] parseCodeLine(String list) { - if (list == null) { - return null; - } - if (list.equals("")) { - return null; - } - String[] temp; - String[] vertexStrings = list.split(" "); - temp = vertexStrings[0].split("/"); - boolean mark = true; - if (!temp[1].equals("")) { - mark = false; - } - Integer[] parsed = new Integer[vertexStrings.length * 3]; - - int j = 0; - for (int i = 0; i < vertexStrings.length; i++) { - if (mark) { - temp = vertexStrings[i].split("//"); - parsed[j] = Integer.parseInt(temp[0]); - parsed[++j] = Integer.parseInt(temp[1]); - } else { - temp = vertexStrings[i].split("/"); - parsed[j] = Integer.parseInt(temp[0]); - parsed[++j] = Integer.parseInt(temp[2]); - } - parsed[++j] = null; - j++; - } - return parsed; - } - - -} diff --git a/src/main/java/labs/introtoprogramming/lab5/object/Parser/Vertex.java b/src/main/java/labs/introtoprogramming/lab5/object/Parser/Vertex.java deleted file mode 100644 index 4af19af..0000000 --- a/src/main/java/labs/introtoprogramming/lab5/object/Parser/Vertex.java +++ /dev/null @@ -1,31 +0,0 @@ -package labs.introtoprogramming.lab5.object.Parser; - -import labs.introtoprogramming.lab5.geometry.Vector3; - -public class Vertex { - /** - * Vertex parameters: geometry coordinates and coordinates of normals - */ - private Vector3 vertexG = null; - private Vector3 vertexN = null; - - public void setVertexG(Vector3 vertexG) { - this.vertexG = vertexG; - } - - public void setVertexN(Vector3 vertexN) { - this.vertexN = vertexN; - } - - public Vector3 getVertexG() { - return vertexG; - } - - public Vector3 getVertexN() { - return vertexN; - } - - public String toString() { - return vertexG + "|" + vertexN; - } -} diff --git a/src/main/java/labs/introtoprogramming/lab5/object/PolygonObject.java b/src/main/java/labs/introtoprogramming/lab5/object/PolygonObject.java new file mode 100644 index 0000000..e4765ec --- /dev/null +++ b/src/main/java/labs/introtoprogramming/lab5/object/PolygonObject.java @@ -0,0 +1,39 @@ +package labs.introtoprogramming.lab5.object; + +import labs.introtoprogramming.lab5.geometry.Ray; +import labs.introtoprogramming.lab5.object.Triangle; +import labs.introtoprogramming.lab5.scene.SceneObject; +import labs.introtoprogramming.lab5.scene.Transform; + +import java.util.ArrayList; +import java.util.List; + +public class PolygonObject extends SceneObject { + + private List triangles; + private Triangle intersection; + + public PolygonObject(Transform transform, List triangles) { + super(transform); + for (Triangle tria : triangles) { + tria.getTransform().setParent(transform); + } + this.triangles = triangles; + } + + @Override + public boolean intersect(Ray ray) { + intersection = null; + double minDistance = Double.POSITIVE_INFINITY; + for (Triangle tria : triangles) { + if (tria.intersect(ray)) { + double distance = ray.getScale(); + if (distance < minDistance) { + minDistance = distance; + intersection = tria; + } + } + } + return intersection != null; + } +} diff --git a/src/test/java/labs/introtoprogramming/lab5/object/Parser/ParseObjFileTest.java b/src/test/java/labs/introtoprogramming/lab5/object/Parser/ParseObjFileTest.java index 4f3c1be..f3fcbea 100644 --- a/src/test/java/labs/introtoprogramming/lab5/object/Parser/ParseObjFileTest.java +++ b/src/test/java/labs/introtoprogramming/lab5/object/Parser/ParseObjFileTest.java @@ -1,6 +1,8 @@ package labs.introtoprogramming.lab5.object.Parser; import labs.introtoprogramming.lab5.geometry.Vector3; +import labs.introtoprogramming.lab5.io.obj.ParseObjFile; +import labs.introtoprogramming.lab5.io.obj.Polygon; import org.junit.Test; import java.io.IOException; @@ -13,12 +15,7 @@ public class ParseObjFileTest { @Test public void ParseTest() throws IOException { //4//4 5//5 18//18 17//17 - ParseObjFile obj = new ParseObjFile( - ParseObjFileTest.class.getResourceAsStream("/LibertStatue.obj")); - Vector3 geometry = obj.getVerticesGeometry().get(4); - Polygon polygon = obj.getPolygonObject().getPolygons().get(4); - Vector3 findGeometry = polygon.getVertices().get(0).getVertexG(); - assertEquals(geometry.x, findGeometry.x, DELTA); - obj.getPolygonObject().toString(); + ParseObjFile obj = new ParseObjFile(); + obj.load(ParseObjFileTest.class.getResourceAsStream("/LibertStatue.obj")); } } diff --git a/src/test/java/labs/introtoprogramming/lab5/object/Parser/StringUtilsTest.java b/src/test/java/labs/introtoprogramming/lab5/object/Parser/StringUtilsTest.java deleted file mode 100644 index 2b83d37..0000000 --- a/src/test/java/labs/introtoprogramming/lab5/object/Parser/StringUtilsTest.java +++ /dev/null @@ -1,19 +0,0 @@ -package labs.introtoprogramming.lab5.object.Parser; - -import org.junit.Test; - -import static org.junit.Assert.assertEquals; - -public class StringUtilsTest { - private static final double DELTA = 1e-10; - - @Test - public void testStringUtil() { - String firstLine = "1//2 1//3 1//5"; - String secondLine = "1/4/2 1/7/3 1/2/5"; - Integer[] firstArr = StringUtils.parseCodeLine(firstLine); - Integer[] secondArr = StringUtils.parseCodeLine(secondLine); - assertEquals(1, secondArr[0], DELTA); - assertEquals(1, secondArr[0], DELTA); - } -} diff --git a/src/test/java/labs/introtoprogramming/lab5/object/Parser/VertexTest.java b/src/test/java/labs/introtoprogramming/lab5/object/Parser/VertexTest.java index 0fe13bd..9596010 100644 --- a/src/test/java/labs/introtoprogramming/lab5/object/Parser/VertexTest.java +++ b/src/test/java/labs/introtoprogramming/lab5/object/Parser/VertexTest.java @@ -1,20 +1,17 @@ package labs.introtoprogramming.lab5.object.Parser; import labs.introtoprogramming.lab5.geometry.Vector3; +import labs.introtoprogramming.lab5.io.obj.Vertex; import org.junit.Test; import static org.junit.Assert.assertEquals; public class VertexTest { - private static final double DELTA = 1e-10; @Test public void testVertex() { - Vertex vertex = new Vertex(); - vertex.setVertexN(new Vector3(0, 0, 0)); - vertex.setVertexG(new Vector3(1, 1, 1)); - assertEquals(1, vertex.getVertexG().x, DELTA); - assertEquals(0, vertex.getVertexN().x, DELTA); - vertex.toString(); + Vertex vertex = new Vertex(Vector3.ZERO, Vector3.ONE); + assertEquals(Vector3.ZERO, vertex.geometry); + assertEquals(Vector3.ONE, vertex.normal); } } From bba3911fe3fe514a4ff07aeaf2157315c2c05bba Mon Sep 17 00:00:00 2001 From: Brook333 Date: Wed, 12 Jun 2019 04:59:58 +0300 Subject: [PATCH 2/2] fix(geometry): fix duplication of polygons with triangulation --- .../lab5/geometry/Triangulation.java | 3 +- .../lab5/geometry/Vector3.java | 5 -- .../lab5/io/obj/ParseObjFile.java | 6 +-- .../lab5/io/obj/Polygon.java | 9 ---- .../lab5/io/obj/ParseObjFileTest.java | 30 ++++++++++++ .../{object/Parser => io/obj}/VertexTest.java | 2 +- .../lab5/object/Parser/ParseObjFileTest.java | 21 -------- src/test/resources/box.obj | 48 +++++++++++++++++++ 8 files changed, 84 insertions(+), 40 deletions(-) create mode 100644 src/test/java/labs/introtoprogramming/lab5/io/obj/ParseObjFileTest.java rename src/test/java/labs/introtoprogramming/lab5/{object/Parser => io/obj}/VertexTest.java (88%) delete mode 100644 src/test/java/labs/introtoprogramming/lab5/object/Parser/ParseObjFileTest.java create mode 100644 src/test/resources/box.obj diff --git a/src/main/java/labs/introtoprogramming/lab5/geometry/Triangulation.java b/src/main/java/labs/introtoprogramming/lab5/geometry/Triangulation.java index 549de28..9fea3c6 100644 --- a/src/main/java/labs/introtoprogramming/lab5/geometry/Triangulation.java +++ b/src/main/java/labs/introtoprogramming/lab5/geometry/Triangulation.java @@ -15,11 +15,12 @@ public List splitPolygons(List polygons) { for (Polygon pol : polygons) { List ver = pol.getVertices(); Vector3 pillar = ver.get(0).geometry; - for (int i = 0; i < ver.size() - 1; i++) { + for (int i = 1; i < ver.size() - 1; i++) { triangles.add(new Triangle(new Transform(), pillar, ver.get(i).geometry, ver.get(i + 1).geometry)); } } + System.out.println(triangles.size()); return triangles; } } diff --git a/src/main/java/labs/introtoprogramming/lab5/geometry/Vector3.java b/src/main/java/labs/introtoprogramming/lab5/geometry/Vector3.java index dd44d0e..ddda264 100644 --- a/src/main/java/labs/introtoprogramming/lab5/geometry/Vector3.java +++ b/src/main/java/labs/introtoprogramming/lab5/geometry/Vector3.java @@ -92,9 +92,4 @@ public int hashCode() { public Object clone() throws CloneNotSupportedException { return super.clone(); } - - @Override - public String toString() { - return x + " : " + y + " : " + z; - } } diff --git a/src/main/java/labs/introtoprogramming/lab5/io/obj/ParseObjFile.java b/src/main/java/labs/introtoprogramming/lab5/io/obj/ParseObjFile.java index a33a1a9..d36b9f2 100644 --- a/src/main/java/labs/introtoprogramming/lab5/io/obj/ParseObjFile.java +++ b/src/main/java/labs/introtoprogramming/lab5/io/obj/ParseObjFile.java @@ -104,12 +104,12 @@ private Polygon parseCodeLine(String list) { for (int i = 0; i < vertexStrings.length; i++) { String[] temp = vertexStrings[i].split("/"); - Vector3 geometry = verticesGeometry.get(Integer.parseInt(temp[0])); + Vector3 geometry = verticesGeometry.get(Integer.parseInt(temp[0]) - 1); int index = -1; - if (temp.length == 3) { + if (temp.length >= 3) { index = Integer.parseInt(temp[2]); } - Vector3 normal = index == -1 ? Vector3.ZERO : verticesNormals.get(index); + Vector3 normal = index == -1 ? Vector3.ZERO : verticesNormals.get(index - 1); vertices.add(new Vertex(geometry, normal)); } return new Polygon(vertices); diff --git a/src/main/java/labs/introtoprogramming/lab5/io/obj/Polygon.java b/src/main/java/labs/introtoprogramming/lab5/io/obj/Polygon.java index 17673f5..19fd603 100644 --- a/src/main/java/labs/introtoprogramming/lab5/io/obj/Polygon.java +++ b/src/main/java/labs/introtoprogramming/lab5/io/obj/Polygon.java @@ -12,13 +12,4 @@ public Polygon(List vertices) { public List getVertices() { return vertices; } - - public String toString() { - StringBuilder s = new StringBuilder(); - for (Vertex v : vertices) { - s.append(v.geometry.toString()) - .append(" || "); - } - return s.toString(); - } } \ No newline at end of file diff --git a/src/test/java/labs/introtoprogramming/lab5/io/obj/ParseObjFileTest.java b/src/test/java/labs/introtoprogramming/lab5/io/obj/ParseObjFileTest.java new file mode 100644 index 0000000..ad1408a --- /dev/null +++ b/src/test/java/labs/introtoprogramming/lab5/io/obj/ParseObjFileTest.java @@ -0,0 +1,30 @@ +package labs.introtoprogramming.lab5.io.obj; + +import labs.introtoprogramming.lab5.geometry.Vector3; +import labs.introtoprogramming.lab5.object.Box; +import labs.introtoprogramming.lab5.object.Triangle; +import org.junit.Test; + +import java.io.IOException; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class ParseObjFileTest { + private static final double DELTA = 1e-10; + + @Test + public void ParseTest() throws IOException { + //4//4 5//5 18//18 17//17 + ParseObjFile obj = new ParseObjFile(); + obj.load(ParseObjFileTest.class.getResourceAsStream("/box.obj")); + List triangles = obj.getPolygons(); + for (Triangle tria : triangles) { + System.out.println(tria); + } + Box boundary = triangles.get(0).getBoundary(); + assertEquals(new Vector3(-0.5, -0.5, 0.5), boundary.lowerBounds); + assertEquals(new Vector3(0.5, 0.5, 0.5), boundary.upperBounds); + } +} diff --git a/src/test/java/labs/introtoprogramming/lab5/object/Parser/VertexTest.java b/src/test/java/labs/introtoprogramming/lab5/io/obj/VertexTest.java similarity index 88% rename from src/test/java/labs/introtoprogramming/lab5/object/Parser/VertexTest.java rename to src/test/java/labs/introtoprogramming/lab5/io/obj/VertexTest.java index 9596010..f20583a 100644 --- a/src/test/java/labs/introtoprogramming/lab5/object/Parser/VertexTest.java +++ b/src/test/java/labs/introtoprogramming/lab5/io/obj/VertexTest.java @@ -1,4 +1,4 @@ -package labs.introtoprogramming.lab5.object.Parser; +package labs.introtoprogramming.lab5.io.obj; import labs.introtoprogramming.lab5.geometry.Vector3; import labs.introtoprogramming.lab5.io.obj.Vertex; diff --git a/src/test/java/labs/introtoprogramming/lab5/object/Parser/ParseObjFileTest.java b/src/test/java/labs/introtoprogramming/lab5/object/Parser/ParseObjFileTest.java deleted file mode 100644 index f3fcbea..0000000 --- a/src/test/java/labs/introtoprogramming/lab5/object/Parser/ParseObjFileTest.java +++ /dev/null @@ -1,21 +0,0 @@ -package labs.introtoprogramming.lab5.object.Parser; - -import labs.introtoprogramming.lab5.geometry.Vector3; -import labs.introtoprogramming.lab5.io.obj.ParseObjFile; -import labs.introtoprogramming.lab5.io.obj.Polygon; -import org.junit.Test; - -import java.io.IOException; - -import static org.junit.Assert.assertEquals; - -public class ParseObjFileTest { - private static final double DELTA = 1e-10; - - @Test - public void ParseTest() throws IOException { - //4//4 5//5 18//18 17//17 - ParseObjFile obj = new ParseObjFile(); - obj.load(ParseObjFileTest.class.getResourceAsStream("/LibertStatue.obj")); - } -} diff --git a/src/test/resources/box.obj b/src/test/resources/box.obj new file mode 100644 index 0000000..f537c0a --- /dev/null +++ b/src/test/resources/box.obj @@ -0,0 +1,48 @@ + +# cube.obj +# + +mtllib cube.mtl +o cube + +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v -0.500000 0.500000 -0.500000 +v 0.500000 0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 + +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 + +vn 0.000000 0.000000 1.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn -1.000000 0.000000 0.000000 + +g cube +usemtl cube +s 1 +f 1/1/1 2/2/1 3/3/1 +f 3/3/1 2/2/1 4/4/1 +s 2 +f 3/1/2 4/2/2 5/3/2 +f 5/3/2 4/2/2 6/4/2 +s 3 +f 5/4/3 6/3/3 7/2/3 +f 7/2/3 6/3/3 8/1/3 +s 4 +f 7/1/4 8/2/4 1/3/4 +f 1/3/4 8/2/4 2/4/4 +s 5 +f 2/1/5 8/2/5 4/3/5 +f 4/3/5 8/2/5 6/4/5 +s 6 +f 7/1/6 1/2/6 5/3/6 +f 5/3/6 1/2/6 3/4/6 \ No newline at end of file