00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00070 #ifndef __vtkBiQuadraticQuadraticHexahedron_h
00071 #define __vtkBiQuadraticQuadraticHexahedron_h
00072
00073 #include "vtkNonLinearCell.h"
00074
00075 class vtkQuadraticEdge;
00076 class vtkQuadraticQuad;
00077 class vtkBiQuadraticQuad;
00078 class vtkHexahedron;
00079 class vtkDoubleArray;
00080
00081 class VTK_FILTERING_EXPORT vtkBiQuadraticQuadraticHexahedron : public vtkNonLinearCell
00082 {
00083 public:
00084 static vtkBiQuadraticQuadraticHexahedron *New();
00085 vtkTypeRevisionMacro(vtkBiQuadraticQuadraticHexahedron,vtkNonLinearCell);
00086 void PrintSelf(ostream& os, vtkIndent indent);
00087
00089
00091 int GetCellType() {return VTK_BIQUADRATIC_QUADRATIC_HEXAHEDRON;}
00092 int GetCellDimension() {return 3;}
00093 int GetNumberOfEdges() {return 12;}
00094 int GetNumberOfFaces() {return 6;}
00095 vtkCell *GetEdge(int);
00096 vtkCell *GetFace(int);
00098
00099 int CellBoundary(int subId, double pcoords[3], vtkIdList *pts);
00100 void Contour(double value, vtkDataArray *cellScalars,
00101 vtkPointLocator *locator, vtkCellArray *verts,
00102 vtkCellArray *lines, vtkCellArray *polys,
00103 vtkPointData *inPd, vtkPointData *outPd,
00104 vtkCellData *inCd, vtkIdType cellId, vtkCellData *outCd);
00105 int EvaluatePosition(double x[3], double* closestPoint,
00106 int& subId, double pcoords[3],
00107 double& dist2, double *weights);
00108 void EvaluateLocation(int& subId, double pcoords[3], double x[3],
00109 double *weights);
00110 int Triangulate(int index, vtkIdList *ptIds, vtkPoints *pts);
00111 void Derivatives(int subId, double pcoords[3], double *values,
00112 int dim, double *derivs);
00113 virtual double *GetParametricCoords();
00114
00116
00119 void Clip(double value, vtkDataArray *cellScalars,
00120 vtkPointLocator *locator, vtkCellArray *tetras,
00121 vtkPointData *inPd, vtkPointData *outPd,
00122 vtkCellData *inCd, vtkIdType cellId, vtkCellData *outCd,
00123 int insideOut);
00125
00127
00129 int IntersectWithLine(double p1[3], double p2[3], double tol, double& t,
00130 double x[3], double pcoords[3], int& subId);
00132
00134
00136 static void InterpolationFunctions(double pcoords[3], double weights[24]);
00137
00138
00139 static void InterpolationDerivs(double pcoords[3], double derivs[72]);
00140
00141
00142
00143 virtual void InterpolateFunctions(double pcoords[3], double weights[24])
00144 {
00145 vtkBiQuadraticQuadraticHexahedron::InterpolationFunctions(pcoords,weights);
00146 }
00147 virtual void InterpolateDerivs(double pcoords[3], double derivs[72])
00148 {
00149 vtkBiQuadraticQuadraticHexahedron::InterpolationDerivs(pcoords,derivs);
00150 }
00151
00152
00153
00154 static int *GetEdgeArray(int edgeId);
00155 static int *GetFaceArray(int faceId);
00157
00161 void JacobianInverse(double pcoords[3], double **inverse, double derivs[72]);
00162
00163 protected:
00164 vtkBiQuadraticQuadraticHexahedron();
00165 ~vtkBiQuadraticQuadraticHexahedron();
00166
00167 vtkQuadraticEdge *Edge;
00168 vtkQuadraticQuad *Face;
00169 vtkBiQuadraticQuad *BiQuadFace;
00170 vtkHexahedron *Hex;
00171 vtkPointData *PointData;
00172 vtkCellData *CellData;
00173 vtkDoubleArray *CellScalars;
00174 vtkDoubleArray *Scalars;
00175
00176 void Subdivide(vtkPointData *inPd, vtkCellData *inCd, vtkIdType cellId,
00177 vtkDataArray *cellScalars);
00178
00179 private:
00180 vtkBiQuadraticQuadraticHexahedron(const vtkBiQuadraticQuadraticHexahedron&);
00181 void operator=(const vtkBiQuadraticQuadraticHexahedron&);
00182 };
00183
00184 #endif
00185
00186