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.
		
		
		
		
		
			
		
			
				
					
					
						
							219 lines
						
					
					
						
							6.0 KiB
						
					
					
				
			
		
		
	
	
							219 lines
						
					
					
						
							6.0 KiB
						
					
					
				| /*=========================================================================
 | |
| 
 | |
|   Program:   Visualization Toolkit
 | |
|   Module:    $RCSfile: vtkPlatonicSolidSource.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.
 | |
| 
 | |
| =========================================================================*/
 | |
| #include "vtkPlatonicSolidSource.h"
 | |
| 
 | |
| #include "vtkInformation.h"
 | |
| #include "vtkInformationVector.h"
 | |
| #include "vtkObjectFactory.h"
 | |
| #include "vtkPolyData.h"
 | |
| #include "vtkCellArray.h"
 | |
| #include "vtkCellData.h"
 | |
| #include "vtkPoints.h"
 | |
| 
 | |
| vtkCxxRevisionMacro(vtkPlatonicSolidSource, "$Revision: 1.4 $");
 | |
| vtkStandardNewMacro(vtkPlatonicSolidSource);
 | |
| 
 | |
| // The geometry and topology of each solid. Solids are centered at
 | |
| // the origin with radius 1.0.
 | |
| // The golden ration phi = (1+sqrt(5))/2=1.61803398875 enters into many 
 | |
| // of these values.
 | |
| static double TetraPoints[] = {
 | |
|   1.0,1.0,1.0, -1.0,1.0,-1.0, 1.0,-1.0,-1.0, -1.0,-1.0,1.0
 | |
| };
 | |
| static vtkIdType TetraVerts[] = {
 | |
|   0,1,2, 1,3,2, 0,2,3, 0,3,1
 | |
| };
 | |
| 
 | |
| static double CubePoints[] = {
 | |
|   -1.0,-1.0,-1.0, 1.0,-1.0,-1.0, 1.0,1.0,-1.0, -1.0,1.0,-1.0,
 | |
|   -1.0,-1.0,1.0, 1.0,-1.0,1.0, 1.0,1.0,1.0, -1.0,1.0,1.0
 | |
| };
 | |
| static vtkIdType CubeVerts[] = {
 | |
|   0,1,5,4, 0,4,7,3, 4,5,6,7, 3,7,6,2, 1,2,6,5, 0,3,2,1
 | |
| };
 | |
| 
 | |
| static double OctPoints[] = {
 | |
|   -1.0,-1.0,0.0, 1.0,-1.0,0.0, 1.0,1.0,0.0, -1.0,1.0,0.0,
 | |
|   0.0,0.0,-1.4142135623731, 0.0,0.0,1.4142135623731
 | |
| };
 | |
| static vtkIdType OctVerts[] = {
 | |
|   4,1,0, 4,2,1, 4,3,2, 4,0,3, 0,1,5, 1,2,5, 2,3,5, 3,0,5
 | |
| };
 | |
| 
 | |
| static double a = 0.61803398875;
 | |
| static double b = 0.381966011250;
 | |
| static double DodePoints[] = {
 | |
|    b, 0, 1,  -b, 0, 1,  b, 0,-1, -b, 0,-1,  0, 1,-b,
 | |
|    0, 1, b,   0,-1,-b,  0,-1, b,  1, b, 0,  1,-b, 0,
 | |
|   -1, b, 0,  -1,-b, 0, -a, a, a,  a,-a, a, -a,-a,-a,
 | |
|    a, a,-a,   a, a, a, -a, a,-a, -a,-a, a,  a,-a,-a
 | |
| };
 | |
| static vtkIdType DodeVerts[] = {
 | |
|   0,1,12,5,16, 1,0,13,7,18, 2,3,14,6,19, 3,2,15,4,17, 4,5,16,8,15,
 | |
|   5,4,17,10,12, 6,7,18,11,14, 7,6,19,9,13, 8,9,13,0,16, 9,8,15,2,19,
 | |
|   10,11,14,3,17, 11,10,12,1,18
 | |
| };
 | |
| 
 | |
| static double c = 0.5;
 | |
| static double d = 0.30901699;
 | |
| static double IcosaPoints[] = {
 | |
|    0.0,d,-c, 0.0,d,c,  0.0,-d,c, -d,c,0.0, 
 | |
|   -d,-c,0.0, d,c,0.0,  d,-c,0.0,  0.0,-d,-c,
 | |
|    c,0.0,d, -c,0.0,d, -c,0.0,-d,  c,0.0,-d
 | |
| };
 | |
| static vtkIdType IcosaVerts[] = {
 | |
|   0,5,3, 1,3,5, 1,2,9, 1,8,2, 0,7,11, 0,10,7, 2,6,4, 7,4,6, 3,9,10,
 | |
|   4,10,9, 5,11,8, 6,8,11, 1,9,3, 1,5,8, 0,3,10, 0,11,5, 7,10,4, 7,6,11,
 | |
|   2,4,9, 2,8,6
 | |
| };
 | |
| 
 | |
| vtkPlatonicSolidSource::vtkPlatonicSolidSource()
 | |
| {
 | |
|   this->SolidType = VTK_SOLID_TETRAHEDRON;
 | |
|   this->SetNumberOfInputPorts(0);
 | |
| }
 | |
| 
 | |
| int vtkPlatonicSolidSource::RequestData(
 | |
|   vtkInformation *vtkNotUsed(request),
 | |
|   vtkInformationVector **vtkNotUsed(inputVector),
 | |
|   vtkInformationVector *outputVector)
 | |
| {
 | |
|   // get the info object
 | |
|   vtkInformation *outInfo = outputVector->GetInformationObject(0);
 | |
| 
 | |
|   // get the ouptut
 | |
|   vtkPolyData *output = vtkPolyData::SafeDownCast(
 | |
|     outInfo->Get(vtkDataObject::DATA_OBJECT()));
 | |
| 
 | |
|   int i;
 | |
|   double *pptr, *solidPoints=NULL, solidScale=1.0;
 | |
|   vtkIdType *cptr, numPts=0, numCells=0, cellSize=0, *solidVerts=NULL;
 | |
| 
 | |
|   vtkDebugMacro(<<"Creating Platonic solid");
 | |
| 
 | |
|   // Based on type, select correct connectivity and point arrays
 | |
|   //
 | |
|   switch (this->SolidType)
 | |
|     {
 | |
|     case VTK_SOLID_TETRAHEDRON:
 | |
|       numPts = 4;
 | |
|       cellSize = 3;
 | |
|       numCells = 4;
 | |
|       solidPoints = TetraPoints;
 | |
|       solidVerts = TetraVerts;
 | |
|       solidScale = 1.0/sqrt(3.0);
 | |
|       break;
 | |
|       
 | |
|     case VTK_SOLID_CUBE:
 | |
|       numPts = 8;
 | |
|       cellSize = 4;
 | |
|       numCells = 6;
 | |
|       solidPoints = CubePoints;
 | |
|       solidVerts = CubeVerts;
 | |
|       solidScale = 1.0/sqrt(3.0);
 | |
|       break;
 | |
|       
 | |
|     case VTK_SOLID_OCTAHEDRON:
 | |
|       numPts = 6;
 | |
|       cellSize = 3;
 | |
|       numCells = 8;
 | |
|       solidPoints = OctPoints;
 | |
|       solidVerts = OctVerts;
 | |
|       solidScale = 1.0/sqrt(2.0);
 | |
|       break;
 | |
|       
 | |
|     case VTK_SOLID_ICOSAHEDRON:
 | |
|       numPts = 12;
 | |
|       cellSize = 3;
 | |
|       numCells = 20;
 | |
|       solidPoints = IcosaPoints;
 | |
|       solidVerts = IcosaVerts;
 | |
|       solidScale = 1.0/0.58778524999243;
 | |
|       break;
 | |
|       
 | |
|     case VTK_SOLID_DODECAHEDRON:
 | |
|       numPts = 20;
 | |
|       cellSize = 5;
 | |
|       numCells = 12;
 | |
|       solidPoints = DodePoints;
 | |
|       solidVerts = DodeVerts;
 | |
|       solidScale = 1.0/1.070466269319;
 | |
|       break;
 | |
|     }
 | |
|   
 | |
|   // Create the solids
 | |
|   //
 | |
|   vtkPoints *pts = vtkPoints::New();
 | |
|   pts->SetDataTypeToDouble();
 | |
|   pts->SetNumberOfPoints(numPts);
 | |
|   vtkCellArray *polys = vtkCellArray::New();
 | |
|   polys->Allocate(polys->EstimateSize(numCells,cellSize));
 | |
|   vtkIntArray *colors = vtkIntArray::New();
 | |
|   colors->SetNumberOfComponents(1);
 | |
|   colors->SetNumberOfTuples(numCells);
 | |
|   
 | |
|   // Points
 | |
|   for ( i=0, pptr=solidPoints; i<numPts; i++, pptr+=3 )
 | |
|     {
 | |
|     pts->SetPoint(i, solidScale*(pptr[0]), solidScale*(pptr[1]), 
 | |
|                      solidScale*(pptr[2]));
 | |
|     }
 | |
|   
 | |
|   // Cells
 | |
|   for ( i=0, cptr=solidVerts; i<numCells; i++, cptr+=cellSize )
 | |
|     {
 | |
|     polys->InsertNextCell(cellSize,cptr);
 | |
|     colors->SetTuple1(i,i);
 | |
|     }
 | |
|   
 | |
|   // Assemble the output
 | |
|   output->SetPoints(pts);
 | |
|   output->SetPolys(polys);
 | |
|   int idx = output->GetCellData()->AddArray(colors);
 | |
|   output->GetCellData()->SetActiveAttribute(idx, vtkDataSetAttributes::SCALARS);
 | |
| 
 | |
|   pts->Delete();
 | |
|   polys->Delete();
 | |
|   colors->Delete();
 | |
| 
 | |
|   return 1;
 | |
| }
 | |
| 
 | |
| void vtkPlatonicSolidSource::PrintSelf(ostream& os, vtkIndent indent)
 | |
| {
 | |
|   this->Superclass::PrintSelf(os,indent);
 | |
| 
 | |
|   os << indent << "Solid Type: " << "\n";
 | |
|   if ( this->SolidType == VTK_SOLID_TETRAHEDRON )
 | |
|     {
 | |
|     os << "Tetrahedron\n";
 | |
|     }
 | |
|   else if ( this->SolidType == VTK_SOLID_CUBE )
 | |
|     {
 | |
|     os << "Cube\n";
 | |
|     }
 | |
|   else if ( this->SolidType == VTK_SOLID_OCTAHEDRON )
 | |
|     {
 | |
|     os << "Octahedron\n";
 | |
|     }
 | |
|   else if ( this->SolidType == VTK_SOLID_ICOSAHEDRON )
 | |
|     {
 | |
|     os << "Icosahedron\n";
 | |
|     }
 | |
|   else //if ( this->SolidType == VTK_SOLID_DODECAHEDRON )
 | |
|     {
 | |
|     os << "Dodecahedron\n";
 | |
|     }
 | |
| }
 | |
| 
 |