1 /*
2 * Licensed to the Apache Software Foundation (ASF) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * The ASF licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.apache.commons.geometry.euclidean.threed.mesh;
18
19 import java.util.List;
20
21 import org.apache.commons.geometry.core.Transform;
22 import org.apache.commons.geometry.euclidean.threed.BoundarySource3D;
23 import org.apache.commons.geometry.euclidean.threed.ConvexPolygon3D;
24 import org.apache.commons.geometry.euclidean.threed.Vector3D;
25
26 /** Interface representing a 3D mesh data structure.
27 * @param <F> Mesh face implementation type
28 * @see <a href="https://en.wikipedia.org/wiki/Polygon_mesh">Polygon Mesh</a>
29 */
30 public interface Mesh<F extends Mesh.Face> extends BoundarySource3D {
31
32 /** Get an iterable containing the vertices in the mesh.
33 * @return an iterable containing the vertices in the mesh
34 */
35 Iterable<Vector3D> vertices();
36
37 /** Get a list containing all vertices in the mesh.
38 * @return a list containing all vertices in the mesh
39 */
40 List<Vector3D> getVertices();
41
42 /** Get the number of vertices in the mesh.
43 * @return the number of vertices in the mesh
44 */
45 int getVertexCount();
46
47 /** Get an iterable containing all faces in the mesh.
48 * @return an iterable containing all faces in the mesh
49 */
50 Iterable<F> faces();
51
52 /** Get a list containing all faces in the mesh.
53 * @return a list containing all faces in the mesh
54 */
55 List<F> getFaces();
56
57 /** Get the number of faces in the mesh.
58 * @return the number of faces in the mesh
59 */
60 int getFaceCount();
61
62 /** Get a face from the mesh by its index.
63 * @param index the index of the mesh to retrieve
64 * @return the face at the given index
65 * @throws IndexOutOfBoundsException if the index is out of bounds
66 */
67 F getFace(int index);
68
69 /** Return a new, transformed mesh by applying the given transform to
70 * all vertices. Faces and vertex ordering are not affected.
71 * @param transform transform to apply
72 * @return a new, transformed mesh
73 */
74 Mesh<F> transform(Transform<Vector3D> transform);
75
76 /** Interface representing a single face in a mesh.
77 */
78 interface Face {
79
80 /** Get the 0-based index of the face in the mesh.
81 * @return the 0-based index of the face in the mesh
82 */
83 int getIndex();
84
85 /** Get an array containing the 0-based indices of the vertices defining
86 * this face. The indices are references to the vertex positions in
87 * the mesh vertex list.
88 * @return an array containing the indices of the vertices defining
89 * this face
90 * @see Mesh#getVertices()
91 */
92 int[] getVertexIndices();
93
94 /** Get the vertices for the face.
95 * @return the vertices for the face
96 */
97 List<Vector3D> getVertices();
98
99 /** Return true if the vertices for this face define a convex polygon
100 * with non-zero size.
101 * @return true if the vertices for this face define a convex polygon
102 * with non-zero size
103 */
104 boolean definesPolygon();
105
106 /** Get the 3D polygon defined by this face.
107 * @return the 3D polygon defined by this face
108 * @throws IllegalArgumentException if the vertices for the face do not
109 * define a polygon
110 * @see #definesPolygon()
111 */
112 ConvexPolygon3D getPolygon();
113 }
114 }