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.
163 lines
5.2 KiB
C++
163 lines
5.2 KiB
C++
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: vtkTessellatedBoxSource.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 vtkTessellatedBoxSource
|
|
* @brief Create a polygonal representation of a box
|
|
* with a given level of subdivision.
|
|
*
|
|
* vtkTessellatedBoxSource creates a axis-aligned box defined by its bounds
|
|
* and a level of subdivision. Connectivity is strong: points of the vertices
|
|
* and inside the edges are shared between faces. In other words, faces are
|
|
* connected. Each face looks like a grid of quads, each quad is composed of
|
|
* 2 triangles.
|
|
* Given a level of subdivision `l', each edge has `l'+2 points, `l' of them
|
|
* are internal edge points, the 2 other ones are the vertices.
|
|
* Each face has a total of (`l'+2)*(`l'+2) points, 4 of them are vertices,
|
|
* 4*`l' are internal edge points, it remains `l'^2 internal face points.
|
|
*
|
|
* This source only generate geometry, no DataArrays like normals or texture
|
|
* coordinates.
|
|
*/
|
|
|
|
#ifndef vtkTessellatedBoxSource_h
|
|
#define vtkTessellatedBoxSource_h
|
|
|
|
#include "vtkFiltersSourcesModule.h" // For export macro
|
|
#include "vtkPolyDataAlgorithm.h"
|
|
|
|
class VTKFILTERSSOURCES_EXPORT vtkTessellatedBoxSource : public vtkPolyDataAlgorithm
|
|
{
|
|
public:
|
|
static vtkTessellatedBoxSource* New();
|
|
vtkTypeMacro(vtkTessellatedBoxSource, vtkPolyDataAlgorithm);
|
|
void PrintSelf(ostream& os, vtkIndent indent) override;
|
|
|
|
//@{
|
|
/**
|
|
* Set the bounds of the box. See GetBounds() for a detail description.
|
|
* \pre xmin<=xmax && ymin<=ymax && zmin<zmax
|
|
*/
|
|
vtkSetVector6Macro(Bounds, double);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Bounds of the box in world coordinates. This a 6-uple of xmin,xmax,ymin,
|
|
* ymax,zmin and zmax. Initial value is (-0.5,0.5,-0.5,0.5,-0.5,0.5), bounds
|
|
* of a cube of length 1 centered at (0,0,0). Bounds are defined such that
|
|
* xmin<=xmax, ymin<=ymax and zmin<zmax.
|
|
* \post xmin<=xmax && ymin<=ymax && zmin<zmax
|
|
*/
|
|
vtkGetVector6Macro(Bounds, double);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Set the level of subdivision of the faces.
|
|
* \pre positive_level: level>=0
|
|
*/
|
|
vtkSetMacro(Level, int);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Level of subdivision of the faces. Initial value is 0.
|
|
* \post positive_level: level>=0
|
|
*/
|
|
vtkGetMacro(Level, int);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Flag to tell the source to duplicate points shared between faces
|
|
* (vertices of the box and internal edge points). Initial value is false.
|
|
* Implementation note: duplicating points is an easier method to implement
|
|
* than a minimal number of points.
|
|
*/
|
|
vtkSetMacro(DuplicateSharedPoints, vtkTypeBool);
|
|
vtkGetMacro(DuplicateSharedPoints, vtkTypeBool);
|
|
vtkBooleanMacro(DuplicateSharedPoints, vtkTypeBool);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Flag to tell the source to generate either a quad or two triangle for a
|
|
* set of four points. Initial value is false (generate triangles).
|
|
*/
|
|
vtkSetMacro(Quads, vtkTypeBool);
|
|
vtkGetMacro(Quads, vtkTypeBool);
|
|
vtkBooleanMacro(Quads, vtkTypeBool);
|
|
//@}
|
|
|
|
//@{
|
|
/**
|
|
* Set/get the desired precision for the output points.
|
|
* vtkAlgorithm::SINGLE_PRECISION - Output single-precision floating point.
|
|
* vtkAlgorithm::DOUBLE_PRECISION - Output double-precision floating point.
|
|
*/
|
|
vtkSetMacro(OutputPointsPrecision, int);
|
|
vtkGetMacro(OutputPointsPrecision, int);
|
|
//@}
|
|
|
|
protected:
|
|
vtkTessellatedBoxSource();
|
|
~vtkTessellatedBoxSource() override;
|
|
|
|
/**
|
|
* Called by the superclass. Actual creation of the points and cells
|
|
* happens here.
|
|
*/
|
|
int RequestData(vtkInformation* request, vtkInformationVector** inputVector,
|
|
vtkInformationVector* outpuVector) override;
|
|
|
|
void DuplicateSharedPointsMethod(double* bounds, vtkPoints* points, vtkCellArray* polys);
|
|
|
|
void MinimalPointsMethod(double* bounds, vtkPoints* points, vtkCellArray* polys);
|
|
|
|
/**
|
|
* Compute the pointId of point (i,j) of face f.
|
|
* Used by MinimalPointsMethod().
|
|
* \pre valid_face: f>=0 && f<6
|
|
* \pre valid_i: i>=0 && i<=(this->Level+1)
|
|
* \pre valid_j: j>=0 && j<=(this->Level+1)
|
|
*/
|
|
vtkIdType LocalFacePointCoordinatesToPointId(int f, int i, int j);
|
|
|
|
/**
|
|
* Build one of the face of the box with some level of tessellation.
|
|
* facePoints[0] is the lower-left point
|
|
* facePoints[1] is the point along the first axis
|
|
* facePoints[2] is the point along the second axis
|
|
* \pre positive_id: firstPointId>=0
|
|
* \pre points_exists: points!=0
|
|
* \pre polys_exists: polys!=0
|
|
*/
|
|
void BuildFace(vtkPoints* points, vtkCellArray* polys, vtkIdType firstPointId,
|
|
double facePoints[3][3], int changed);
|
|
|
|
double Bounds[6];
|
|
int Level;
|
|
vtkTypeBool DuplicateSharedPoints;
|
|
vtkTypeBool Quads;
|
|
int OutputPointsPrecision;
|
|
|
|
private:
|
|
vtkTessellatedBoxSource(const vtkTessellatedBoxSource&) = delete;
|
|
void operator=(const vtkTessellatedBoxSource&) = delete;
|
|
};
|
|
|
|
#endif
|