VTK
dox/Graphics/vtkMeshQuality.h
Go to the documentation of this file.
00001 /*=========================================================================
00002 
00003   Program:   Visualization Toolkit
00004   Module:    vtkMeshQuality.h
00005   Language:  C++
00006 
00007   Copyright 2003-2006 Sandia Corporation.
00008   Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
00009   license for use of this work by or on behalf of the
00010   U.S. Government. Redistribution and use in source and binary forms, with
00011   or without modification, are permitted provided that this Notice and any
00012   statement of authorship are reproduced on all copies.
00013 
00014   Contact: dcthomp@sandia.gov,pppebay@sandia.gov
00015 
00016 =========================================================================*/
00067 #ifndef __vtkMeshQuality_h
00068 #define __vtkMeshQuality_h
00069 
00070 #include "vtkDataSetAlgorithm.h"
00071 
00072 class vtkCell;
00073 class vtkDataArray;
00074 
00075 #define VTK_QUALITY_EDGE_RATIO 0
00076 #define VTK_QUALITY_ASPECT_RATIO 1
00077 #define VTK_QUALITY_RADIUS_RATIO 2
00078 #define VTK_QUALITY_ASPECT_FROBENIUS 3
00079 #define VTK_QUALITY_MED_ASPECT_FROBENIUS 4
00080 #define VTK_QUALITY_MAX_ASPECT_FROBENIUS 5
00081 #define VTK_QUALITY_MIN_ANGLE 6
00082 #define VTK_QUALITY_COLLAPSE_RATIO 7
00083 #define VTK_QUALITY_MAX_ANGLE 8
00084 #define VTK_QUALITY_CONDITION 9
00085 #define VTK_QUALITY_SCALED_JACOBIAN 10
00086 #define VTK_QUALITY_SHEAR 11
00087 #define VTK_QUALITY_RELATIVE_SIZE_SQUARED 12
00088 #define VTK_QUALITY_SHAPE 13
00089 #define VTK_QUALITY_SHAPE_AND_SIZE 14
00090 #define VTK_QUALITY_DISTORTION 15
00091 #define VTK_QUALITY_MAX_EDGE_RATIO 16
00092 #define VTK_QUALITY_SKEW 17
00093 #define VTK_QUALITY_TAPER 18
00094 #define VTK_QUALITY_VOLUME 19
00095 #define VTK_QUALITY_STRETCH 20
00096 #define VTK_QUALITY_DIAGONAL 21
00097 #define VTK_QUALITY_DIMENSION 22
00098 #define VTK_QUALITY_ODDY 23
00099 #define VTK_QUALITY_SHEAR_AND_SIZE 24
00100 #define VTK_QUALITY_JACOBIAN 25
00101 #define VTK_QUALITY_WARPAGE 26
00102 #define VTK_QUALITY_ASPECT_GAMMA 27
00103 #define VTK_QUALITY_AREA 28
00104 #define VTK_QUALITY_ASPECT_BETA 29
00105 
00106 class VTK_GRAPHICS_EXPORT vtkMeshQuality : public vtkDataSetAlgorithm
00107 {
00108 public:
00109   void PrintSelf(ostream& os, vtkIndent indent);
00110   vtkTypeMacro(vtkMeshQuality,vtkDataSetAlgorithm);
00111   static vtkMeshQuality* New();
00112 
00114 
00117   vtkSetMacro(SaveCellQuality,int);
00118   vtkGetMacro(SaveCellQuality,int);
00119   vtkBooleanMacro(SaveCellQuality,int);
00121 
00123 
00131   vtkSetMacro(TriangleQualityMeasure,int);
00132   vtkGetMacro(TriangleQualityMeasure,int);
00133   void SetTriangleQualityMeasureToArea()
00134     {
00135     this->SetTriangleQualityMeasure( VTK_QUALITY_AREA );
00136     }
00137   void SetTriangleQualityMeasureToEdgeRatio()
00138     {
00139     this->SetTriangleQualityMeasure( VTK_QUALITY_EDGE_RATIO );
00140     }
00141   void SetTriangleQualityMeasureToAspectRatio()
00142     {
00143     this->SetTriangleQualityMeasure( VTK_QUALITY_ASPECT_RATIO );
00144     }
00145   void SetTriangleQualityMeasureToRadiusRatio()
00146     {
00147     this->SetTriangleQualityMeasure( VTK_QUALITY_RADIUS_RATIO );
00148     }
00149   void SetTriangleQualityMeasureToAspectFrobenius()
00150     {
00151     this->SetTriangleQualityMeasure( VTK_QUALITY_ASPECT_FROBENIUS );
00152     }
00153   void SetTriangleQualityMeasureToMinAngle()
00154     {
00155     this->SetTriangleQualityMeasure( VTK_QUALITY_MIN_ANGLE );
00156     }
00157   void SetTriangleQualityMeasureToMaxAngle()
00158     {
00159     this->SetTriangleQualityMeasure( VTK_QUALITY_MAX_ANGLE );
00160     }
00161   void SetTriangleQualityMeasureToCondition()
00162     {
00163     this->SetTriangleQualityMeasure( VTK_QUALITY_CONDITION );
00164     }
00165   void SetTriangleQualityMeasureToScaledJacobian()
00166     {
00167     this->SetTriangleQualityMeasure( VTK_QUALITY_SCALED_JACOBIAN );
00168     }
00169   void SetTriangleQualityMeasureToRelativeSizeSquared()
00170     {
00171     this->SetTriangleQualityMeasure( VTK_QUALITY_RELATIVE_SIZE_SQUARED );
00172     }
00173   void SetTriangleQualityMeasureToShape()
00174     {
00175     this->SetTriangleQualityMeasure( VTK_QUALITY_SHAPE );
00176     }
00177   void SetTriangleQualityMeasureToShapeAndSize()
00178     {
00179     this->SetTriangleQualityMeasure( VTK_QUALITY_SHAPE_AND_SIZE );
00180     }
00181   void SetTriangleQualityMeasureToDistortion()
00182     {
00183     this->SetTriangleQualityMeasure( VTK_QUALITY_DISTORTION );
00184     }
00186 
00188 
00202   vtkSetMacro(QuadQualityMeasure,int);
00203   vtkGetMacro(QuadQualityMeasure,int);
00204   void SetQuadQualityMeasureToEdgeRatio()
00205     {
00206     this->SetQuadQualityMeasure( VTK_QUALITY_EDGE_RATIO );
00207     }
00208   void SetQuadQualityMeasureToAspectRatio()
00209     {
00210     this->SetQuadQualityMeasure( VTK_QUALITY_ASPECT_RATIO );
00211     }
00212   void SetQuadQualityMeasureToRadiusRatio()
00213     {
00214     this->SetQuadQualityMeasure( VTK_QUALITY_RADIUS_RATIO );
00215     }
00216   void SetQuadQualityMeasureToMedAspectFrobenius()
00217     {
00218     this->SetQuadQualityMeasure( VTK_QUALITY_MED_ASPECT_FROBENIUS );
00219     }
00220   void SetQuadQualityMeasureToMaxAspectFrobenius()
00221     {
00222     this->SetQuadQualityMeasure( VTK_QUALITY_MAX_ASPECT_FROBENIUS );
00223     }
00224   void SetQuadQualityMeasureToMaxEdgeRatios()
00225     {
00226     this->SetQuadQualityMeasure( VTK_QUALITY_MAX_EDGE_RATIO );
00227     }
00228   void SetQuadQualityMeasureToSkew()
00229     {
00230     this->SetQuadQualityMeasure( VTK_QUALITY_SKEW );
00231     }
00232   void SetQuadQualityMeasureToTaper()
00233     {
00234     this->SetQuadQualityMeasure( VTK_QUALITY_TAPER );
00235     }
00236   void SetQuadQualityMeasureToWarpage()
00237     {
00238     this->SetQuadQualityMeasure( VTK_QUALITY_WARPAGE );
00239     }
00240   void SetQuadQualityMeasureToArea()
00241     {
00242     this->SetQuadQualityMeasure( VTK_QUALITY_AREA );
00243     }
00244   void SetQuadQualityMeasureToStretch()
00245     {
00246     this->SetQuadQualityMeasure( VTK_QUALITY_STRETCH );
00247     }
00248   void SetQuadQualityMeasureToMinAngle()
00249     {
00250     this->SetQuadQualityMeasure( VTK_QUALITY_MIN_ANGLE );
00251     }
00252   void SetQuadQualityMeasureToMaxAngle()
00253     {
00254     this->SetQuadQualityMeasure( VTK_QUALITY_MAX_ANGLE );
00255     }
00256   void SetQuadQualityMeasureToOddy()
00257     {
00258     this->SetQuadQualityMeasure( VTK_QUALITY_ODDY );
00259     }
00260   void SetQuadQualityMeasureToCondition()
00261     {
00262     this->SetQuadQualityMeasure( VTK_QUALITY_CONDITION );
00263     }
00264   void SetQuadQualityMeasureToJacobian()
00265     {
00266     this->SetQuadQualityMeasure( VTK_QUALITY_JACOBIAN );
00267     }
00268   void SetQuadQualityMeasureToScaledJacobian()
00269     {
00270     this->SetQuadQualityMeasure( VTK_QUALITY_SCALED_JACOBIAN );
00271     }
00272   void SetQuadQualityMeasureToShear()
00273     {
00274     this->SetQuadQualityMeasure( VTK_QUALITY_SHEAR );
00275     }
00276   void SetQuadQualityMeasureToShape()
00277     {
00278     this->SetQuadQualityMeasure( VTK_QUALITY_SHAPE );
00279     }
00280   void SetQuadQualityMeasureToRelativeSizeSquared()
00281     {
00282     this->SetQuadQualityMeasure( VTK_QUALITY_RELATIVE_SIZE_SQUARED );
00283     }
00284   void SetQuadQualityMeasureToShapeAndSize()
00285     {
00286     this->SetQuadQualityMeasure( VTK_QUALITY_SHAPE_AND_SIZE );
00287     }
00288   void SetQuadQualityMeasureToShearAndSize()
00289     {
00290     this->SetQuadQualityMeasure( VTK_QUALITY_SHEAR_AND_SIZE );
00291     }
00292   void SetQuadQualityMeasureToDistortion()
00293     {
00294     this->SetQuadQualityMeasure( VTK_QUALITY_DISTORTION );
00295     }
00297 
00299 
00309   vtkSetMacro(TetQualityMeasure,int);
00310   vtkGetMacro(TetQualityMeasure,int);
00311   void SetTetQualityMeasureToEdgeRatio()
00312     {
00313     this->SetTetQualityMeasure( VTK_QUALITY_EDGE_RATIO );
00314     }
00315   void SetTetQualityMeasureToAspectRatio()
00316     {
00317     this->SetTetQualityMeasure( VTK_QUALITY_ASPECT_RATIO );
00318     }
00319   void SetTetQualityMeasureToRadiusRatio()
00320     {
00321     this->SetTetQualityMeasure( VTK_QUALITY_RADIUS_RATIO );
00322     }
00323   void SetTetQualityMeasureToAspectFrobenius()
00324     {
00325     this->SetTetQualityMeasure( VTK_QUALITY_ASPECT_FROBENIUS );
00326     }
00327   void SetTetQualityMeasureToMinAngle()
00328     {
00329     this->SetTetQualityMeasure( VTK_QUALITY_MIN_ANGLE );
00330     }
00331   void SetTetQualityMeasureToCollapseRatio()
00332     {
00333     this->SetTetQualityMeasure( VTK_QUALITY_COLLAPSE_RATIO );
00334     }
00335   void SetTetQualityMeasureToAspectBeta()
00336     {
00337     this->SetTetQualityMeasure( VTK_QUALITY_ASPECT_BETA );
00338     }
00339   void SetTetQualityMeasureToAspectGamma()
00340     {
00341     this->SetTetQualityMeasure( VTK_QUALITY_ASPECT_GAMMA );
00342     }
00343   void SetTetQualityMeasureToVolume()
00344     {
00345     this->SetTetQualityMeasure( VTK_QUALITY_VOLUME );
00346     }
00347   void SetTetQualityMeasureToCondition()
00348     {
00349     this->SetTetQualityMeasure( VTK_QUALITY_CONDITION );
00350     }
00351   void SetTetQualityMeasureToJacobian()
00352     {
00353     this->SetTetQualityMeasure( VTK_QUALITY_JACOBIAN );
00354     }
00355   void SetTetQualityMeasureToScaledJacobian()
00356     {
00357     this->SetTetQualityMeasure( VTK_QUALITY_SCALED_JACOBIAN );
00358     }
00359   void SetTetQualityMeasureToShape()
00360     {
00361     this->SetTetQualityMeasure( VTK_QUALITY_SHAPE );
00362     }
00363   void SetTetQualityMeasureToRelativeSizeSquared()
00364     {
00365     this->SetTetQualityMeasure( VTK_QUALITY_RELATIVE_SIZE_SQUARED );
00366     }
00367   void SetTetQualityMeasureToShapeAndSize()
00368     {
00369     this->SetTetQualityMeasure( VTK_QUALITY_SHAPE_AND_SIZE );
00370     }
00371   void SetTetQualityMeasureToDistortion()
00372     {
00373     this->SetTetQualityMeasure( VTK_QUALITY_DISTORTION );
00374     }
00376 
00378 
00388   vtkSetMacro(HexQualityMeasure,int);
00389   vtkGetMacro(HexQualityMeasure,int);
00390   void SetHexQualityMeasureToEdgeRatio()
00391     {
00392     this->SetHexQualityMeasure( VTK_QUALITY_EDGE_RATIO );
00393     }
00394   void SetHexQualityMeasureToMedAspectFrobenius()
00395     {
00396     this->SetHexQualityMeasure( VTK_QUALITY_MED_ASPECT_FROBENIUS );
00397     }
00398   void SetHexQualityMeasureToMaxAspectFrobenius()
00399     {
00400     this->SetHexQualityMeasure( VTK_QUALITY_MAX_ASPECT_FROBENIUS );
00401     }
00402   void SetHexQualityMeasureToMaxEdgeRatios()
00403     {
00404     this->SetHexQualityMeasure( VTK_QUALITY_MAX_EDGE_RATIO );
00405     }
00406   void SetHexQualityMeasureToSkew()
00407     {
00408     this->SetHexQualityMeasure( VTK_QUALITY_SKEW );
00409     }
00410   void SetHexQualityMeasureToTaper()
00411     {
00412     this->SetHexQualityMeasure( VTK_QUALITY_TAPER );
00413     }
00414   void SetHexQualityMeasureToVolume()
00415     {
00416     this->SetHexQualityMeasure( VTK_QUALITY_VOLUME );
00417     }
00418   void SetHexQualityMeasureToStretch()
00419     {
00420     this->SetHexQualityMeasure( VTK_QUALITY_STRETCH );
00421     }
00422   void SetHexQualityMeasureToDiagonal()
00423     {
00424     this->SetHexQualityMeasure( VTK_QUALITY_DIAGONAL );
00425     }
00426   void SetHexQualityMeasureToDimension()
00427     {
00428     this->SetHexQualityMeasure( VTK_QUALITY_DIMENSION );
00429     }
00430   void SetHexQualityMeasureToOddy()
00431     {
00432     this->SetHexQualityMeasure( VTK_QUALITY_ODDY );
00433     }
00434   void SetHexQualityMeasureToCondition()
00435     {
00436     this->SetHexQualityMeasure( VTK_QUALITY_CONDITION );
00437     }
00438   void SetHexQualityMeasureToJacobian()
00439     {
00440     this->SetHexQualityMeasure( VTK_QUALITY_JACOBIAN );
00441     }
00442   void SetHexQualityMeasureToScaledJacobian()
00443     {
00444     this->SetHexQualityMeasure( VTK_QUALITY_SCALED_JACOBIAN );
00445     }
00446   void SetHexQualityMeasureToShear()
00447     {
00448     this->SetHexQualityMeasure( VTK_QUALITY_SHEAR );
00449     }
00450   void SetHexQualityMeasureToShape()
00451     {
00452     this->SetHexQualityMeasure( VTK_QUALITY_SHAPE );
00453     }
00454   void SetHexQualityMeasureToRelativeSizeSquared()
00455     {
00456     this->SetHexQualityMeasure( VTK_QUALITY_RELATIVE_SIZE_SQUARED );
00457     }
00458   void SetHexQualityMeasureToShapeAndSize()
00459     {
00460     this->SetHexQualityMeasure( VTK_QUALITY_SHAPE_AND_SIZE );
00461     }
00462   void SetHexQualityMeasureToShearAndSize()
00463     {
00464     this->SetHexQualityMeasure( VTK_QUALITY_SHEAR_AND_SIZE );
00465     }
00466   void SetHexQualityMeasureToDistortion()
00467     {
00468     this->SetHexQualityMeasure( VTK_QUALITY_DISTORTION );
00469     }
00471 
00476   static double TriangleArea( vtkCell* cell );
00477 
00485   static double TriangleEdgeRatio( vtkCell* cell );
00486 
00494   static double TriangleAspectRatio( vtkCell* cell );
00495 
00502   static double TriangleRadiusRatio( vtkCell* cell );
00503 
00513   static double TriangleAspectFrobenius( vtkCell* cell );
00514 
00520   static double TriangleMinAngle( vtkCell* cell );
00521 
00527   static double TriangleMaxAngle( vtkCell* cell );
00528 
00533   static double TriangleCondition( vtkCell* cell );
00534 
00539   static double TriangleScaledJacobian( vtkCell* cell );
00540 
00545   static double TriangleRelativeSizeSquared( vtkCell* cell );
00546 
00551   static double TriangleShape( vtkCell* cell );
00552 
00557   static double TriangleShapeAndSize( vtkCell* cell );
00558 
00563   static double TriangleDistortion( vtkCell* cell );
00564 
00572   static double QuadEdgeRatio( vtkCell* cell );
00573 
00583   static double QuadAspectRatio( vtkCell* cell );
00584 
00598   static double QuadRadiusRatio( vtkCell* cell );
00599 
00611   static double QuadMedAspectFrobenius( vtkCell* cell );
00612 
00624   static double QuadMaxAspectFrobenius( vtkCell* cell );
00625 
00631   static double QuadMinAngle( vtkCell* cell );
00632 
00633   static double QuadMaxEdgeRatios( vtkCell* cell );
00634   static double QuadSkew( vtkCell* cell );
00635   static double QuadTaper( vtkCell* cell );
00636   static double QuadWarpage( vtkCell* cell );
00637   static double QuadArea( vtkCell* cell );
00638   static double QuadStretch( vtkCell* cell );
00639   static double QuadMaxAngle( vtkCell* cell );
00640   static double QuadOddy( vtkCell* cell );
00641   static double QuadCondition( vtkCell* cell );
00642   static double QuadJacobian( vtkCell* cell );
00643   static double QuadScaledJacobian( vtkCell* cell );
00644   static double QuadShear( vtkCell* cell );
00645   static double QuadShape( vtkCell* cell );
00646   static double QuadRelativeSizeSquared( vtkCell* cell );
00647   static double QuadShapeAndSize( vtkCell* cell );
00648   static double QuadShearAndSize( vtkCell* cell );
00649   static double QuadDistortion( vtkCell* cell );
00650 
00658   static double TetEdgeRatio( vtkCell* cell );
00659 
00667   static double TetAspectRatio( vtkCell* cell );
00668 
00675   static double TetRadiusRatio( vtkCell* cell );
00676 
00687   static double TetAspectFrobenius( vtkCell* cell );
00688 
00694   static double TetMinAngle( vtkCell* cell );
00695 
00697 
00704   static double TetCollapseRatio( vtkCell* cell );
00705   static double TetAspectBeta( vtkCell* cell );
00706   static double TetAspectGamma( vtkCell* cell );
00707   static double TetVolume( vtkCell* cell );
00708   static double TetCondition( vtkCell* cell );
00709   static double TetJacobian( vtkCell* cell );
00710   static double TetScaledJacobian( vtkCell* cell );
00711   static double TetShape( vtkCell* cell );
00712   static double TetRelativeSizeSquared( vtkCell* cell );
00713   static double TetShapeandSize( vtkCell* cell );
00714   static double TetDistortion( vtkCell* cell );
00716 
00724   static double HexEdgeRatio( vtkCell* cell );
00725 
00732   static double HexMedAspectFrobenius( vtkCell* cell );
00733 
00735 
00741   static double HexMaxAspectFrobenius( vtkCell* cell );
00742   static double HexMaxEdgeRatio( vtkCell* cell );
00743   static double HexSkew( vtkCell* cell );
00744   static double HexTaper( vtkCell* cell );
00745   static double HexVolume( vtkCell* cell );
00746   static double HexStretch( vtkCell* cell );
00747   static double HexDiagonal( vtkCell* cell );
00748   static double HexDimension( vtkCell* cell );
00749   static double HexOddy( vtkCell* cell );
00750   static double HexCondition( vtkCell* cell );
00751   static double HexJacobian( vtkCell* cell );
00752   static double HexScaledJacobian( vtkCell* cell );
00753   static double HexShear( vtkCell* cell );
00754   static double HexShape( vtkCell* cell );
00755   static double HexRelativeSizeSquared( vtkCell* cell );
00756   static double HexShapeAndSize( vtkCell* cell );
00757   static double HexShearAndSize( vtkCell* cell );
00758   static double HexDistortion( vtkCell* cell );
00760 
00762 
00768   virtual void SetRatio( int r ) { this->SetSaveCellQuality( r ); }
00769   int GetRatio() { return this->GetSaveCellQuality(); }
00770   vtkBooleanMacro(Ratio,int);
00772 
00774 
00786   virtual void SetVolume( int cv )
00787     {
00788     if ( ! ((cv != 0) ^ (this->Volume != 0)) )
00789       {
00790       return;
00791       }
00792     this->Modified();
00793     this->Volume = cv;
00794     if ( this->Volume )
00795       {
00796       this->CompatibilityModeOn();
00797       }
00798     }
00799   int GetVolume()
00800     {
00801     return this->Volume;
00802     }
00803   vtkBooleanMacro(Volume,int);
00805 
00807 
00825   virtual void SetCompatibilityMode( int cm )
00826     {
00827     if ( !((cm != 0) ^ (this->CompatibilityMode != 0)) )
00828       {
00829       return;
00830       }
00831     this->CompatibilityMode = cm;
00832     this->Modified();
00833     if ( this->CompatibilityMode )
00834       {
00835       this->Volume = 1;
00836       this->TetQualityMeasure = VTK_QUALITY_RADIUS_RATIO;
00837       }
00838     }
00839   vtkGetMacro(CompatibilityMode,int);
00840   vtkBooleanMacro(CompatibilityMode,int);
00842 
00843 protected:
00844   vtkMeshQuality();
00845   ~vtkMeshQuality();
00846 
00847   virtual int RequestData(vtkInformation *, vtkInformationVector **, vtkInformationVector *);
00848 
00851   static int GetCurrentTriangleNormal( double point[3], double normal[3] );
00852 
00853   int SaveCellQuality;
00854   int TriangleQualityMeasure;
00855   int QuadQualityMeasure;
00856   int TetQualityMeasure;
00857   int HexQualityMeasure;
00858 
00859   int CompatibilityMode;
00860   int Volume;
00861 
00862   vtkDataArray* CellNormals;
00863   static double CurrentTriNormal[3];
00864 
00865 private:
00866   vtkMeshQuality( const vtkMeshQuality& ); // Not implemented.
00867   void operator = ( const vtkMeshQuality& ); // Not implemented.
00868 };
00869 
00870 #endif // vtkMeshQuality_h