You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							400 lines
						
					
					
						
							13 KiB
						
					
					
				
			
		
		
	
	
							400 lines
						
					
					
						
							13 KiB
						
					
					
				| /*=========================================================================
 | |
| 
 | |
|   Program:   Visualization Toolkit
 | |
|   Module:    $RCSfile: quadraticEvaluation.cxx,v $
 | |
| 
 | |
|   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.
 | |
| 
 | |
| =========================================================================*/
 | |
| // .NAME 
 | |
| // .SECTION Description
 | |
| // This program tests quadratic cell EvaluatePosition() and EvaluateLocation()
 | |
| // methods.
 | |
| 
 | |
| #include "vtkDebugLeaks.h"
 | |
| 
 | |
| #include "vtkIdList.h"
 | |
| #include "vtkQuadraticEdge.h"
 | |
| #include "vtkQuadraticTriangle.h"
 | |
| #include "vtkQuadraticQuad.h"
 | |
| #include "vtkQuadraticHexahedron.h"
 | |
| #include "vtkQuadraticTetra.h"
 | |
| #include "vtkQuadraticWedge.h"
 | |
| #include "vtkQuadraticPyramid.h"
 | |
| 
 | |
| void  ComputeDataValues(vtkPoints *pts, double *edgeValues)
 | |
| {
 | |
|   double x[3];
 | |
|   int numPts = pts->GetNumberOfPoints();
 | |
|   for (int i=0; i<numPts; i++)
 | |
|     {
 | |
|     pts->GetPoint(i,x);
 | |
|     double dem = (1.0 + x[0]);
 | |
|     if(fabs(dem) < 1.e-08)
 | |
|       {
 | |
|       edgeValues[i] = 0;
 | |
|       }
 | |
|     else
 | |
|       {
 | |
|       edgeValues[i] = 1.0 / dem; //simple linear function for now
 | |
|       }
 | |
|     }
 | |
| }
 | |
| 
 | |
| int TestQE(ostream& strm)
 | |
| {
 | |
|   // actual test
 | |
|   double dist2;
 | |
|   int subId;
 | |
| 
 | |
|   //-----------------------------------------------------------
 | |
|   strm << "Test instantiation New() and NewInstance() Start" << endl;
 | |
|   vtkQuadraticEdge *edge = vtkQuadraticEdge::New();
 | |
|   vtkQuadraticEdge *edge2 = edge->NewInstance();
 | |
|   
 | |
|   vtkQuadraticTriangle *tri = vtkQuadraticTriangle::New();
 | |
|   vtkQuadraticTriangle *tri2 = tri->NewInstance();
 | |
|   
 | |
|   vtkQuadraticQuad *quad = vtkQuadraticQuad::New();
 | |
|   vtkQuadraticQuad *quad2 = quad->NewInstance();
 | |
|   
 | |
|   vtkQuadraticTetra *tetra = vtkQuadraticTetra::New();
 | |
|   vtkQuadraticTetra *tetra2 = tetra->NewInstance();
 | |
|   
 | |
|   vtkQuadraticHexahedron *hex = vtkQuadraticHexahedron::New();
 | |
|   vtkQuadraticHexahedron *hex2 = hex->NewInstance();
 | |
| 
 | |
|   vtkQuadraticWedge *wedge = vtkQuadraticWedge::New();
 | |
|   vtkQuadraticWedge *wedge2 = wedge->NewInstance();
 | |
| 
 | |
|   vtkQuadraticPyramid *pyra = vtkQuadraticPyramid::New();
 | |
|   vtkQuadraticHexahedron *pyra2 = hex->NewInstance();
 | |
| 
 | |
|   edge2->Delete();
 | |
|   tri2->Delete();
 | |
|   quad2->Delete();
 | |
|   tetra2->Delete();
 | |
|   hex2->Delete();
 | |
|   wedge2->Delete();
 | |
|   pyra2->Delete();
 | |
| 
 | |
|   strm << "Test instantiation New() and NewInstance() End" << endl;
 | |
|   
 | |
| 
 | |
|   //-------------------------------------------------------------
 | |
|   strm << "Test vtkCell::EvaluatePosition Start" << endl;
 | |
| 
 | |
|   // vtkQuadraticEdge
 | |
|   double edgePCoords[3], edgeWeights[3], edgePosition[3];
 | |
|   double edgePoint[1][3] = {{0.25, 0.125, 0.0}};
 | |
|   double edgeClosest[3];
 | |
| 
 | |
|   edge->GetPointIds()->SetId(0,0);
 | |
|   edge->GetPointIds()->SetId(1,1);
 | |
|   edge->GetPointIds()->SetId(2,2);
 | |
| 
 | |
|   edge->GetPoints()->SetPoint(0, 0, 0, 0);
 | |
|   edge->GetPoints()->SetPoint(1, 1, 0, .5);
 | |
|   edge->GetPoints()->SetPoint(2, 0.5, 0.25, .2);
 | |
| 
 | |
|   edge->EvaluatePosition(edgePoint[0], edgeClosest, subId, edgePCoords, 
 | |
|                          dist2, edgeWeights);
 | |
| 
 | |
|   // vtkQuadraticTriangle
 | |
|   double triPCoords[3], triWeights[6], triPosition[3];
 | |
|   double triPoint[1][3] = {{0.5, 0.266667, 0.0}};
 | |
|   double triClosest[3];
 | |
| 
 | |
|   tri->GetPointIds()->SetId(0,0);
 | |
|   tri->GetPointIds()->SetId(1,1);
 | |
|   tri->GetPointIds()->SetId(2,2);
 | |
|   tri->GetPointIds()->SetId(3,3);
 | |
|   tri->GetPointIds()->SetId(4,4);
 | |
|   tri->GetPointIds()->SetId(5,5);
 | |
| 
 | |
|   tri->GetPoints()->SetPoint(0, 0, 0, 0);
 | |
|   tri->GetPoints()->SetPoint(1, 1, 0, 0);
 | |
|   tri->GetPoints()->SetPoint(2, 0.5, 0.8, 0);
 | |
|   tri->GetPoints()->SetPoint(3, 0.5, 0.0, 0);
 | |
|   tri->GetPoints()->SetPoint(4, 0.75, 0.4, 0);
 | |
|   tri->GetPoints()->SetPoint(5, 0.25, 0.4, 0);
 | |
| 
 | |
|   tri->EvaluatePosition(triPoint[0], triClosest, subId, triPCoords, 
 | |
|                         dist2, triWeights);
 | |
| 
 | |
|   
 | |
|   // vtkQuadraticQuad
 | |
|   double quadPCoords[3], quadWeights[8], quadPosition[3];
 | |
|   double quadPoint[1][3] = {{0.25, 0.33, 0.0}};
 | |
|   double quadClosest[3];
 | |
|   
 | |
|   quad->GetPointIds()->SetId(0,0);
 | |
|   quad->GetPointIds()->SetId(1,1);
 | |
|   quad->GetPointIds()->SetId(2,2);
 | |
|   quad->GetPointIds()->SetId(3,3);
 | |
|   quad->GetPointIds()->SetId(4,4);
 | |
|   quad->GetPointIds()->SetId(5,5);
 | |
|   quad->GetPointIds()->SetId(6,6);
 | |
|   quad->GetPointIds()->SetId(7,7);
 | |
| 
 | |
|   quad->GetPoints()->SetPoint(0, 0.0, 0.0, 0.0);
 | |
|   quad->GetPoints()->SetPoint(1, 1.0, 0.0, 0.0);
 | |
|   quad->GetPoints()->SetPoint(2, 1.0, 1.0, 0.0);
 | |
|   quad->GetPoints()->SetPoint(3, 0.0, 1.0, 0.0);
 | |
|   quad->GetPoints()->SetPoint(4, 0.5, 0.0, 0.0);
 | |
|   quad->GetPoints()->SetPoint(5, 1.0, 0.5, 0.0);
 | |
|   quad->GetPoints()->SetPoint(6, 0.5, 1.0, 0.0);
 | |
|   quad->GetPoints()->SetPoint(7, 0.0, 0.5, 0.0);
 | |
| 
 | |
|   quad->EvaluatePosition(quadPoint[0], quadClosest, subId, quadPCoords, 
 | |
|                          dist2, quadWeights);
 | |
| 
 | |
|   // vtkQuadraticTetra
 | |
|   double tetraPCoords[3], tetraWeights[10], tetraPosition[3];
 | |
|   double tetraPoint[1][3] = {{0.5, 0.266667, 0.333333}};
 | |
|   double tetraClosest[3];
 | |
|   
 | |
|   tetra->GetPointIds()->SetId(0,0);
 | |
|   tetra->GetPointIds()->SetId(1,1);
 | |
|   tetra->GetPointIds()->SetId(2,2);
 | |
|   tetra->GetPointIds()->SetId(3,3);
 | |
|   tetra->GetPointIds()->SetId(4,4);
 | |
|   tetra->GetPointIds()->SetId(5,5);
 | |
|   tetra->GetPointIds()->SetId(6,6);
 | |
|   tetra->GetPointIds()->SetId(7,7);
 | |
|   tetra->GetPointIds()->SetId(8,8);
 | |
|   tetra->GetPointIds()->SetId(9,9);
 | |
| 
 | |
|   tetra->GetPoints()->SetPoint(0, 0.0, 0.0, 0.0);
 | |
|   tetra->GetPoints()->SetPoint(1, 1.0, 0.0, 0.0);
 | |
|   tetra->GetPoints()->SetPoint(2, 0.5, 0.8, 0.0);
 | |
|   tetra->GetPoints()->SetPoint(3, 0.5, 0.4, 1.0);
 | |
|   tetra->GetPoints()->SetPoint(4, 0.5, 0.0,  0.0);
 | |
|   tetra->GetPoints()->SetPoint(5, 0.75, 0.4, 0.0);
 | |
|   tetra->GetPoints()->SetPoint(6, 0.25, 0.4, 0.0);
 | |
|   tetra->GetPoints()->SetPoint(7, 0.25, 0.2, 0.5);
 | |
|   tetra->GetPoints()->SetPoint(8, 0.75, 0.2, 0.5);
 | |
|   tetra->GetPoints()->SetPoint(9, 0.50, 0.6, 0.5);
 | |
| 
 | |
|   tetra->EvaluatePosition(tetraPoint[0], tetraClosest, subId, tetraPCoords, 
 | |
|                          dist2, tetraWeights);
 | |
| 
 | |
|   
 | |
|   // vtkQuadraticHexahedron
 | |
|   double hexPCoords[3], hexWeights[20], hexPosition[3];
 | |
|   double hexPoint[1][3] = {{0.25, 0.33333, 0.666667}};
 | |
|   double hexClosest[3];
 | |
|   
 | |
|   hex->GetPointIds()->SetId(0,0);
 | |
|   hex->GetPointIds()->SetId(1,1);
 | |
|   hex->GetPointIds()->SetId(2,2);
 | |
|   hex->GetPointIds()->SetId(3,3);
 | |
|   hex->GetPointIds()->SetId(4,4);
 | |
|   hex->GetPointIds()->SetId(5,5);
 | |
|   hex->GetPointIds()->SetId(6,6);
 | |
|   hex->GetPointIds()->SetId(7,7);
 | |
|   hex->GetPointIds()->SetId(8,8);
 | |
|   hex->GetPointIds()->SetId(9,9);
 | |
|   hex->GetPointIds()->SetId(10,10);
 | |
|   hex->GetPointIds()->SetId(11,11);
 | |
|   hex->GetPointIds()->SetId(12,12);
 | |
|   hex->GetPointIds()->SetId(13,13);
 | |
|   hex->GetPointIds()->SetId(14,14);
 | |
|   hex->GetPointIds()->SetId(15,15);
 | |
|   hex->GetPointIds()->SetId(16,16);
 | |
|   hex->GetPointIds()->SetId(17,17);
 | |
|   hex->GetPointIds()->SetId(18,18);
 | |
|   hex->GetPointIds()->SetId(19,19);
 | |
| 
 | |
|   hex->GetPoints()->SetPoint( 0, 0, 0, 0  );
 | |
|   hex->GetPoints()->SetPoint( 1, 1, 0, 0  );
 | |
|   hex->GetPoints()->SetPoint( 2, 1, 1, 0  );
 | |
|   hex->GetPoints()->SetPoint( 3, 0, 1, 0  );
 | |
|   hex->GetPoints()->SetPoint( 4, 0, 0, 1  );
 | |
|   hex->GetPoints()->SetPoint( 5, 1, 0, 1  );
 | |
|   hex->GetPoints()->SetPoint( 6, 1, 1, 1  );
 | |
|   hex->GetPoints()->SetPoint( 7, 0, 1, 1  );
 | |
|   hex->GetPoints()->SetPoint( 8, 0.5, 0, 0);
 | |
|   hex->GetPoints()->SetPoint( 9, 1, 0.5, 0);
 | |
|   hex->GetPoints()->SetPoint(10, 0.5, 1, 0);
 | |
|   hex->GetPoints()->SetPoint(11, 0, 0.5, 0);
 | |
|   hex->GetPoints()->SetPoint(12, 0.5, 0, 1);
 | |
|   hex->GetPoints()->SetPoint(13, 1, 0.5, 1);
 | |
|   hex->GetPoints()->SetPoint(14, 0.5, 1, 1);
 | |
|   hex->GetPoints()->SetPoint(15, 0, 0.5, 1);
 | |
|   hex->GetPoints()->SetPoint(16, 0, 0, 0.5);
 | |
|   hex->GetPoints()->SetPoint(17, 1, 0, 0.5);
 | |
|   hex->GetPoints()->SetPoint(18, 1, 1, 0.5);
 | |
|   hex->GetPoints()->SetPoint(19, 0, 1, 0.5);
 | |
| 
 | |
|   hex->EvaluatePosition(hexPoint[0], hexClosest, subId, hexPCoords, 
 | |
|                          dist2, hexWeights);
 | |
| 
 | |
|   // vtkQuadraticWedge
 | |
|   double wedgePCoords[3], wedgeWeights[20], wedgePosition[3];
 | |
|   double wedgePoint[1][3] = {{0.25, 0.33333, 0.666667}};
 | |
|   double wedgeClosest[3];
 | |
|   
 | |
|   wedge->GetPointIds()->SetId(0,0);
 | |
|   wedge->GetPointIds()->SetId(1,1);
 | |
|   wedge->GetPointIds()->SetId(2,2);
 | |
|   wedge->GetPointIds()->SetId(3,3);
 | |
|   wedge->GetPointIds()->SetId(4,4);
 | |
|   wedge->GetPointIds()->SetId(5,5);
 | |
|   wedge->GetPointIds()->SetId(6,6);
 | |
|   wedge->GetPointIds()->SetId(7,7);
 | |
|   wedge->GetPointIds()->SetId(8,8);
 | |
|   wedge->GetPointIds()->SetId(9,9);
 | |
|   wedge->GetPointIds()->SetId(10,10);
 | |
|   wedge->GetPointIds()->SetId(11,11);
 | |
|   wedge->GetPointIds()->SetId(12,12);
 | |
|   wedge->GetPointIds()->SetId(13,13);
 | |
|   wedge->GetPointIds()->SetId(14,14);
 | |
| 
 | |
|   wedge->GetPoints()->SetPoint( 0, 0, 0, 0  );
 | |
|   wedge->GetPoints()->SetPoint( 1, 1, 0, 0  );
 | |
|   wedge->GetPoints()->SetPoint( 2, 0, 1, 0  );
 | |
|   wedge->GetPoints()->SetPoint( 3, 0, 0, 1  );
 | |
|   wedge->GetPoints()->SetPoint( 4, 1, 0, 1  );
 | |
|   wedge->GetPoints()->SetPoint( 5, 0, 1, 1  );
 | |
|   wedge->GetPoints()->SetPoint( 6, 0.5, 0, 0  );
 | |
|   wedge->GetPoints()->SetPoint( 7, 0.5, 0.5, 0  );
 | |
|   wedge->GetPoints()->SetPoint( 8, 0, 0.5, 0);
 | |
|   wedge->GetPoints()->SetPoint( 9, 0.5, 0, 1);
 | |
|   wedge->GetPoints()->SetPoint(10, 0.5, 0.5, 1);
 | |
|   wedge->GetPoints()->SetPoint(11, 0, 0.5, 1);
 | |
|   wedge->GetPoints()->SetPoint(12, 0, 0, 0.5);
 | |
|   wedge->GetPoints()->SetPoint(13, 1, 0, 0.5);
 | |
|   wedge->GetPoints()->SetPoint(14, 0, 1, 0.5);
 | |
| 
 | |
|   wedge->EvaluatePosition(wedgePoint[0], wedgeClosest, subId, wedgePCoords, 
 | |
|                          dist2, wedgeWeights);
 | |
| 
 | |
|   // vtkQuadraticPyramid
 | |
|   double pyraPCoords[3], pyraWeights[20], pyraPosition[3];
 | |
|   double pyraPoint[1][3] = {{0.25, 0.33333, 0.666667}};
 | |
|   double pyraClosest[3];
 | |
|   
 | |
|   pyra->GetPointIds()->SetId(0,0);
 | |
|   pyra->GetPointIds()->SetId(1,1);
 | |
|   pyra->GetPointIds()->SetId(2,2);
 | |
|   pyra->GetPointIds()->SetId(3,3);
 | |
|   pyra->GetPointIds()->SetId(4,4);
 | |
|   pyra->GetPointIds()->SetId(5,5);
 | |
|   pyra->GetPointIds()->SetId(6,6);
 | |
|   pyra->GetPointIds()->SetId(7,7);
 | |
|   pyra->GetPointIds()->SetId(8,8);
 | |
|   pyra->GetPointIds()->SetId(9,9);
 | |
|   pyra->GetPointIds()->SetId(10,10);
 | |
|   pyra->GetPointIds()->SetId(11,11);
 | |
|   pyra->GetPointIds()->SetId(12,12);
 | |
| 
 | |
|   pyra->GetPoints()->SetPoint( 0, 0, 0, 0  );
 | |
|   pyra->GetPoints()->SetPoint( 1, 1, 0, 0  );
 | |
|   pyra->GetPoints()->SetPoint( 2, 1, 1, 0  );
 | |
|   pyra->GetPoints()->SetPoint( 3, 0, 1, 0  );
 | |
|   pyra->GetPoints()->SetPoint( 4, 0, 0, 1  );
 | |
|   pyra->GetPoints()->SetPoint( 5, 0.5, 0, 0  );
 | |
|   pyra->GetPoints()->SetPoint( 6, 1, 0.5, 0  );
 | |
|   pyra->GetPoints()->SetPoint( 7, 0.5, 1, 0  );
 | |
|   pyra->GetPoints()->SetPoint( 8, 0, 0.5, 0  );
 | |
|   pyra->GetPoints()->SetPoint( 9, 0, 0, 0.5  );
 | |
|   pyra->GetPoints()->SetPoint(10, 0.5, 0, 0.5  );
 | |
|   pyra->GetPoints()->SetPoint(11, 0.5, 0.5, 0.5  );
 | |
|   pyra->GetPoints()->SetPoint(12, 0, 0.5, 0.5  );
 | |
| 
 | |
|   pyra->EvaluatePosition(pyraPoint[0], pyraClosest, subId, pyraPCoords, 
 | |
|                          dist2, pyraWeights);
 | |
| 
 | |
|   strm << "Test vtkCell::EvaluatePosition End" << endl;
 | |
| 
 | |
|   //-------------------------------------------------------------
 | |
|   strm << "Test vtkCell::EvaluateLocation Start" << endl;
 | |
|   // vtkQuadraticEdge
 | |
|   edge->EvaluateLocation(subId, edgePCoords, edgePosition, edgeWeights);
 | |
|   
 | |
|   // vtkQuadraticTriangle
 | |
|   tri->EvaluateLocation(subId, triPCoords, triPosition, triWeights);
 | |
|   
 | |
|   // vtkQuadraticQuad
 | |
|   quad->EvaluateLocation(subId, quadPCoords, quadPosition, quadWeights);
 | |
|   
 | |
|   // vtkQuadraticTetra
 | |
|   tetra->EvaluateLocation(subId, tetraPCoords, tetraPosition, tetraWeights);
 | |
|   
 | |
|   // vtkQuadraticHexahedron
 | |
|   hexPCoords[0] = 0.25;
 | |
|   hexPCoords[1] = 0.33;
 | |
|   hexPCoords[2] = 0.75;
 | |
|   hex->EvaluateLocation(subId, hexPCoords, hexPosition, hexWeights);
 | |
|   
 | |
|   // vtkQuadraticWedge
 | |
|   wedge->EvaluateLocation(subId, wedgePCoords, wedgePosition, wedgeWeights);
 | |
| 
 | |
|   // vtkQuadraticPyramid
 | |
|   pyra->EvaluateLocation(subId, pyraPCoords, pyraPosition, pyraWeights);
 | |
| 
 | |
|   strm << "Test vtkCell::EvaluateLocation End" << endl;
 | |
| 
 | |
|   //-------------------------------------------------------------
 | |
|   strm << "Test vtkCell::CellDerivs Start" << endl;
 | |
| 
 | |
|   // vtkQuadraticEdge - temporarily commented out
 | |
| //  double edgeValues[3], edgeDerivs[3];
 | |
| //  ComputeDataValues(edge->Points,edgeValues);
 | |
| //  edge->Derivatives(subId, edgePCoords, edgeValues, 1, edgeDerivs);
 | |
|   
 | |
|   // vtkQuadraticTriangle
 | |
|   double triValues[6], triDerivs[3];
 | |
|   ComputeDataValues(tri->Points,triValues);
 | |
|   tri->Derivatives(subId, triPCoords, triValues, 1, triDerivs);
 | |
|   
 | |
|   // vtkQuadraticQuad
 | |
|   double quadValues[8], quadDerivs[3];
 | |
|   ComputeDataValues(quad->Points,quadValues);
 | |
|   quad->Derivatives(subId, quadPCoords, quadValues, 1, quadDerivs);
 | |
|   
 | |
|   // vtkQuadraticTetra
 | |
|   double tetraValues[10], tetraDerivs[3];
 | |
|   ComputeDataValues(tetra->Points,tetraValues);
 | |
|   tetra->Derivatives(subId, tetraPCoords, tetraValues, 1, tetraDerivs);
 | |
|   
 | |
|   // vtkQuadraticHexahedron
 | |
|   double hexValues[20], hexDerivs[3];
 | |
|   ComputeDataValues(hex->Points,hexValues);
 | |
|   hex->Derivatives(subId, hexPCoords, hexValues, 1, hexDerivs);
 | |
|   
 | |
|   // vtkQuadraticWedge
 | |
|   double wedgeValues[15], wedgeDerivs[3];
 | |
|   ComputeDataValues(wedge->Points,wedgeValues);
 | |
|   wedge->Derivatives(subId, wedgePCoords, wedgeValues, 1, wedgeDerivs);
 | |
| 
 | |
|   // vtkQuadraticPyramid
 | |
|   double pyraValues[13], pyraDerivs[3];
 | |
|   ComputeDataValues(pyra->Points,pyraValues);
 | |
|   pyra->Derivatives(subId, pyraPCoords, pyraValues, 1, pyraDerivs);
 | |
| 
 | |
|   strm << "Test vtkCell::CellDerivs End" << endl;
 | |
| 
 | |
|   edge->Delete();
 | |
|   tri->Delete();
 | |
|   quad->Delete();
 | |
|   tetra->Delete();
 | |
|   hex->Delete();
 | |
|   wedge->Delete();
 | |
|   pyra->Delete();
 | |
| 
 | |
|   return 0;
 | |
| }
 | |
| 
 | |
| int quadraticEvaluation(int,char *[])
 | |
| {
 | |
|   ostrstream vtkmsg_with_warning_C4701; 
 | |
|   return TestQE(vtkmsg_with_warning_C4701);
 | |
| } 
 | |
| 
 |