1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
/*=========================================================================
Program: Visualization Toolkit
Module: vtkPixel.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 vtkPixel
* @brief a cell that represents an orthogonal quadrilateral
*
* vtkPixel is a concrete implementation of vtkCell to represent a 2D
* orthogonal quadrilateral. Unlike vtkQuad, the corners are at right angles,
* and aligned along x-y-z coordinate axes leading to large increases in
* computational efficiency.
*/
#ifndef vtkPixel_h
#define vtkPixel_h
#include "vtkCell.h"
#include "vtkCommonDataModelModule.h" // For export macro
VTK_ABI_NAMESPACE_BEGIN
class vtkLine;
class vtkIncrementalPointLocator;
class VTKCOMMONDATAMODEL_EXPORT vtkPixel : public vtkCell
{
public:
static vtkPixel* New();
vtkTypeMacro(vtkPixel, vtkCell);
void PrintSelf(ostream& os, vtkIndent indent) override;
///@{
/**
* See the vtkCell API for descriptions of these methods.
*/
int GetCellType() override { return VTK_PIXEL; }
int GetCellDimension() override { return 2; }
int GetNumberOfEdges() override { return 4; }
int GetNumberOfFaces() override { return 0; }
vtkCell* GetEdge(int edgeId) override;
vtkCell* GetFace(int) override { return nullptr; }
int CellBoundary(int subId, const double pcoords[3], vtkIdList* pts) override;
void Contour(double value, vtkDataArray* cellScalars, vtkIncrementalPointLocator* locator,
vtkCellArray* verts, vtkCellArray* lines, vtkCellArray* polys, vtkPointData* inPd,
vtkPointData* outPd, vtkCellData* inCd, vtkIdType cellId, vtkCellData* outCd) override;
void Clip(double value, vtkDataArray* cellScalars, vtkIncrementalPointLocator* locator,
vtkCellArray* polys, vtkPointData* inPd, vtkPointData* outPd, vtkCellData* inCd,
vtkIdType cellId, vtkCellData* outCd, int insideOut) override;
int EvaluatePosition(const double x[3], double closestPoint[3], int& subId, double pcoords[3],
double& dist2, double weights[]) override;
void EvaluateLocation(int& subId, const double pcoords[3], double x[3], double* weights) override;
///@}
/**
* Inflates this pixel by a distance of dist by moving the edges of the pixel
* by that distance. Since a pixel lies in 3D, the degenerate case where the
* pixel is homogeneous to a line are discarted because of normal direction
* ambiguity. Hence, if you shrink a 2D pixel so it loses thickness in one
* dimension. inflating it back to its previous form is impossible.
*
* A degenerate pixel of dimension 1 is inflated the same way a segment would be
* inflated. A degenerate pixel of dimension 0 is untouched.
*
* \return 1
*/
int Inflate(double dist) override;
/**
* Computes exact bounding sphere of this pixel.
*/
double ComputeBoundingSphere(double center[3]) const override;
/**
* Return the center of the triangle in parametric coordinates.
*/
int GetParametricCenter(double pcoords[3]) override;
int IntersectWithLine(const double p1[3], const double p2[3], double tol, double& t, double x[3],
double pcoords[3], int& subId) override;
int Triangulate(int index, vtkIdList* ptIds, vtkPoints* pts) override;
void Derivatives(
int subId, const double pcoords[3], const double* values, int dim, double* derivs) override;
double* GetParametricCoords() override;
static void InterpolationFunctions(const double pcoords[3], double weights[4]);
static void InterpolationDerivs(const double pcoords[3], double derivs[8]);
///@{
/**
* Compute the interpolation functions/derivatives
* (aka shape functions/derivatives)
*/
void InterpolateFunctions(const double pcoords[3], double weights[4]) override
{
vtkPixel::InterpolationFunctions(pcoords, weights);
}
void InterpolateDerivs(const double pcoords[3], double derivs[8]) override
{
vtkPixel::InterpolationDerivs(pcoords, derivs);
}
///@}
/**
* vtkPixel's normal cannot be computed using vtkPolygon::ComputeNormal because
* its points are not sorted such that circulating on them forms the pixel.
* This is a convenient method so one can compute normals on a pixel.
*/
int ComputeNormal(double n[3]);
protected:
vtkPixel();
~vtkPixel() override;
vtkLine* Line;
private:
vtkPixel(const vtkPixel&) = delete;
void operator=(const vtkPixel&) = delete;
};
//----------------------------------------------------------------------------
inline int vtkPixel::GetParametricCenter(double pcoords[3])
{
pcoords[0] = pcoords[1] = 0.5;
pcoords[2] = 0.0;
return 0;
}
VTK_ABI_NAMESPACE_END
#endif
|