You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

157 lines
5.5 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkRectilinearGridToTetrahedra.h
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
All rights reserved.
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notice for more information.
=========================================================================*/
/**
* @class vtkRectilinearGridToTetrahedra
* @brief create a Tetrahedral mesh from a RectilinearGrid
*
* vtkRectilinearGridToTetrahedra forms a mesh of Tetrahedra from a
* vtkRectilinearGrid. The tetrahedra can be 5 per cell, 6 per cell,
* or a mixture of 5 or 12 per cell. The resulting mesh is consistent,
* meaning that there are no edge crossings and that each tetrahedron
* face is shared by two tetrahedra, except those tetrahedra on the
* boundary. All tetrahedra are right handed.
*
* Note that 12 tetrahedra per cell means adding a point in the
* center of the cell.
*
* In order to subdivide some cells into 5 and some cells into 12 tetrahedra:
* SetTetraPerCellTo5And12();
* Set the Scalars of the Input RectilinearGrid to be 5 or 12
* depending on what you want per cell of the RectilinearGrid.
*
* If you set RememberVoxelId, the scalars of the tetrahedron
* will be set to the Id of the Cell in the RectilinearGrid from which
* the tetrahedron came.
*
* @par Thanks:
* This class was developed by Samson J. Timoner of the
* MIT Artificial Intelligence Laboratory
*
* @sa
* vtkDelaunay3D
*/
#ifndef vtkRectilinearGridToTetrahedra_h
#define vtkRectilinearGridToTetrahedra_h
// ways to create the mesh from voxels
#define VTK_VOXEL_TO_12_TET 12
#define VTK_VOXEL_TO_5_TET 5
#define VTK_VOXEL_TO_6_TET 6
#define VTK_VOXEL_TO_5_AND_12_TET -1
#include "vtkFiltersGeneralModule.h" // For export macro
#include "vtkUnstructuredGridAlgorithm.h"
class vtkRectilinearGrid;
class vtkSignedCharArray;
class vtkIdList;
class vtkCellArray;
class vtkPoints;
class VTKFILTERSGENERAL_EXPORT vtkRectilinearGridToTetrahedra : public vtkUnstructuredGridAlgorithm
{
public:
vtkTypeMacro(vtkRectilinearGridToTetrahedra, vtkUnstructuredGridAlgorithm);
void PrintSelf(ostream& os, vtkIndent indent) override;
/**
* Form 5 Tetrahedra per cube. Do not RememberVoxelId.
*/
static vtkRectilinearGridToTetrahedra* New();
//@{
/**
* Set the method to divide each cell (voxel) in the RectilinearGrid
* into tetrahedra.
*/
void SetTetraPerCellTo5() { SetTetraPerCell(VTK_VOXEL_TO_5_TET); }
void SetTetraPerCellTo6() { SetTetraPerCell(VTK_VOXEL_TO_6_TET); }
void SetTetraPerCellTo12() { SetTetraPerCell(VTK_VOXEL_TO_12_TET); }
void SetTetraPerCellTo5And12() { SetTetraPerCell(VTK_VOXEL_TO_5_AND_12_TET); }
vtkSetMacro(TetraPerCell, int);
vtkGetMacro(TetraPerCell, int);
//@}
//@{
/**
* Should the tetrahedra have scalar data
* indicating which Voxel they came from in the vtkRectilinearGrid?
*/
vtkSetMacro(RememberVoxelId, vtkTypeBool);
vtkGetMacro(RememberVoxelId, vtkTypeBool);
vtkBooleanMacro(RememberVoxelId, vtkTypeBool);
//@}
/**
* This function for convenience for creating a Rectilinear Grid
* If Spacing does not fit evenly into extent, the last cell will
* have a different width (or height or depth).
* If Extent[i]/Spacing[i] is within tol of an integer, then
* assume the programmer meant an integer for direction i.
*/
void SetInput(const double Extent[3], const double Spacing[3], const double tol = 0.001);
/**
* This version of the function for the wrappers
*/
void SetInput(const double ExtentX, const double ExtentY, const double ExtentZ,
const double SpacingX, const double SpacingY, const double SpacingZ, const double tol = 0.001);
protected:
vtkRectilinearGridToTetrahedra();
~vtkRectilinearGridToTetrahedra() override {}
int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override;
vtkTypeBool RememberVoxelId;
int TetraPerCell;
int FillInputPortInformation(int, vtkInformation*) override;
private:
vtkRectilinearGridToTetrahedra(const vtkRectilinearGridToTetrahedra&) = delete;
void operator=(const vtkRectilinearGridToTetrahedra&) = delete;
/**
* Determine how to Divide each cell (voxel) in the RectilinearGrid
* Overwrites VoxelSubdivisionType with flipping information for forming the mesh
*/
static void DetermineGridDivisionTypes(vtkRectilinearGrid* RectGrid,
vtkSignedCharArray* VoxelSubdivisionType, const int& TetraPerCell);
/**
* Take the grid and make it into a tetrahedral mesh.
*/
static void GridToTetMesh(vtkRectilinearGrid* RectGrid, vtkSignedCharArray* VoxelSubdivisionType,
const int& TetraPerCell, const int& RememberVoxelId, vtkUnstructuredGrid* TetMesh);
/**
* Take a voxel and make tetrahedra out of it.
* Add the resulting tetrahedra to TetraMesh. Also, should new
* points need to be created, add them to NodeList.
* Note that vtkIdList may be changed during this process (a point added).
*/
static int TetrahedralizeVoxel(
vtkIdList* VoxelCorners, const int& DivisionType, vtkPoints* NodeList, vtkCellArray* TetList);
/**
* Helper Function for TetrahedraizeVoxel
* Adds a center point in the middle of the voxel
*/
static inline void TetrahedralizeAddCenterPoint(vtkIdList* VoxelCorners, vtkPoints* NodeList);
};
#endif /* vtkRectilinearGridToTetrahedra_h */