VTK
|
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