Cloned library of VTK-5.0.0 with extra build files for internal package management.
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

/*=========================================================================
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";
}
}