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 }