/* * Copyright (C) 2010-2014 Mathias Unberath * CONRAD is developed as an Open Source project under the GNU General Public License (GPL). */ package edu.stanford.rsl.conrad.geometry.shapes.mesh; import java.io.BufferedReader; import java.io.FileReader; import java.io.IOException; import java.util.ArrayList; import java.util.StringTokenizer; import edu.stanford.rsl.conrad.geometry.shapes.simple.PointND; import edu.stanford.rsl.conrad.io.VTKMeshIO; import edu.stanford.rsl.conrad.numerics.SimpleMatrix; /** * Class to read and store a mesh in a legacy .vtk polydata file. A triangular mesh as produced by Paraview or the * itkMeshFileWriter is assumed. The reader-method builds upon VTKMeshReader implemented by Marco Boegel. * Extended to meshes featuring deformation vectors at each mesh vertex by Tobias Geimer. * @author Mathias Unberath * */ public class Mesh{ public static final boolean DEBUG = false; /** * Dimension of the vertices; */ public int dimension; /** * The number of vertices in the mesh. */ public int numPoints; /** * The number of connections in the connectivity information, e.g. triangles. */ public int numConnections; /** * The matrix containing the points of the mesh. */ private SimpleMatrix points; /** * The matrix containing the connectivity information. */ private SimpleMatrix triangles; /** * The matrix containing the deformation vectors. */ private SimpleMatrix deformations; //========================================================================================== // METHODS //========================================================================================== /** * Constructs an empty Mesh object. */ public Mesh(){ } /** * Constructs a Mesh object and directly calls the readMesh method on the filename input. * @param filename The filename of the mesh to be read. */ public Mesh(String filename){ try { if(DEBUG){ System.out.println("Reading mesh in file: " + filename); } readMesh(filename); } catch (IOException e) { e.printStackTrace(); } } /** * Sets the connectivity and number of connections. * @param con The connectivity. */ public void setConnectivity(SimpleMatrix con){ this.triangles = con; this.numConnections = con.getRows(); } /** * Getter for the connectivity information. * @return The connectivity information. */ public SimpleMatrix getConnectivity(){ return this.triangles; } /** * Sets the deformations at each vertex. * @param deform The deformation. */ public void setDeformation(SimpleMatrix deform){ this.deformations = deform; } /** * Getter for the deformation information. * @return The deformation information. */ public SimpleMatrix getDeformation(){ return this.deformations; } /** * Sets the vertices, e.g points, and number of vertices. * @param p The matrix containing the vertices. */ public void setPoints(SimpleMatrix p){ this.points = p; this.numPoints = p.getRows(); this.dimension = p.getCols(); } /** * Sets the vertices, e.g points, and number of vertices. * @param p The ArrayList containing the vertices. */ public void setPoints(ArrayList<PointND> p){ SimpleMatrix m = toSimpleMatrix(p); this.points = m; this.numPoints = m.getRows(); this.dimension = m.getCols(); } /** * Getter for the points, i.e. vertices. * @return The matrix containing the vertices. */ public SimpleMatrix getPoints(){ return this.points; } /** * Convenience method to read a triangular mesh in legacy .vtk polydata format using {@link VTKMeshIO}. * @param filename The filename of the mesh to be read. * @throws IOException if .vtk format does not match expected format */ public void readMesh(String filename) throws IOException{ VTKMeshIO reader = new VTKMeshIO(filename); reader.read(); Mesh tmpMesh = reader.getMesh(); this.numPoints = tmpMesh.numPoints; this.points = tmpMesh.getPoints(); this.dimension = tmpMesh.dimension; this.numConnections = tmpMesh.numConnections; this.triangles = tmpMesh.getConnectivity(); this.deformations = tmpMesh.getDeformation(); } /** * Converts the ArrayList into a SimpleMatrix structure. * @param list The ArrayList to be converted. * @return The SimpleMatrix containing the ArrayList's entries. */ private SimpleMatrix toSimpleMatrix(ArrayList<PointND> list){ int rows = list.size(); int cols = list.get(0).getDimension(); SimpleMatrix pts = new SimpleMatrix(rows,cols); for(int i = 0; i < rows; i++){ PointND point = list.get(i); for(int j = 0; j < cols; j++){ pts.setElementValue(i, j, point.get(j)); } } return pts; } }