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.
195 lines
5.0 KiB
195 lines
5.0 KiB
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: $RCSfile: vtkImplicitDataSet.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 "vtkImplicitDataSet.h"
|
|
|
|
#include "vtkCell.h"
|
|
#include "vtkDataSet.h"
|
|
#include "vtkGarbageCollector.h"
|
|
#include "vtkObjectFactory.h"
|
|
#include "vtkPointData.h"
|
|
|
|
vtkCxxRevisionMacro(vtkImplicitDataSet, "$Revision: 1.26 $");
|
|
vtkStandardNewMacro(vtkImplicitDataSet);
|
|
vtkCxxSetObjectMacro(vtkImplicitDataSet,DataSet,vtkDataSet);
|
|
|
|
// Construct an vtkImplicitDataSet with no initial dataset; the OutValue
|
|
// set to a large negative number; and the OutGradient set to (0,0,1).
|
|
vtkImplicitDataSet::vtkImplicitDataSet()
|
|
{
|
|
this->DataSet = NULL;
|
|
|
|
this->OutValue = -VTK_DOUBLE_MAX;
|
|
|
|
this->OutGradient[0] = 0.0;
|
|
this->OutGradient[1] = 0.0;
|
|
this->OutGradient[2] = 1.0;
|
|
|
|
this->Weights = NULL;
|
|
this->Size = 0;
|
|
}
|
|
|
|
vtkImplicitDataSet::~vtkImplicitDataSet()
|
|
{
|
|
this->SetDataSet(NULL);
|
|
if ( this->Weights )
|
|
{
|
|
delete [] this->Weights;
|
|
}
|
|
}
|
|
|
|
// Evaluate the implicit function. This returns the interpolated scalar value
|
|
// at x[3].
|
|
double vtkImplicitDataSet::EvaluateFunction(double x[3])
|
|
{
|
|
vtkDataArray *scalars;
|
|
vtkCell *cell;
|
|
vtkIdType id;
|
|
int subId, i, numPts;
|
|
double pcoords[3], s;
|
|
|
|
if ( this->DataSet->GetMaxCellSize() > this->Size )
|
|
{
|
|
if ( this->Weights )
|
|
{
|
|
delete [] this->Weights;
|
|
}
|
|
this->Weights = new double[this->DataSet->GetMaxCellSize()];
|
|
this->Size = this->DataSet->GetMaxCellSize();
|
|
}
|
|
|
|
// See if a dataset has been specified
|
|
if ( !this->DataSet ||
|
|
!(scalars = this->DataSet->GetPointData()->GetScalars()) )
|
|
{
|
|
vtkErrorMacro(<<"Can't evaluate dataset!");
|
|
return this->OutValue;
|
|
}
|
|
|
|
// Find the cell that contains xyz and get it
|
|
cell = this->DataSet->FindAndGetCell(x,NULL,-1,0.0,subId,pcoords,this->Weights);
|
|
|
|
if (cell)
|
|
{ // Interpolate the point data
|
|
numPts = cell->GetNumberOfPoints();
|
|
for (s=0.0, i=0; i < numPts; i++)
|
|
{
|
|
id = cell->PointIds->GetId(i);
|
|
s += scalars->GetComponent(id,0) * this->Weights[i];
|
|
}
|
|
return s;
|
|
}
|
|
else
|
|
{ // use outside value
|
|
return this->OutValue;
|
|
}
|
|
}
|
|
|
|
unsigned long vtkImplicitDataSet::GetMTime()
|
|
{
|
|
unsigned long mTime=this->vtkImplicitFunction::GetMTime();
|
|
unsigned long DataSetMTime;
|
|
|
|
if ( this->DataSet != NULL )
|
|
{
|
|
this->DataSet->Update ();
|
|
DataSetMTime = this->DataSet->GetMTime();
|
|
mTime = ( DataSetMTime > mTime ? DataSetMTime : mTime );
|
|
}
|
|
|
|
return mTime;
|
|
}
|
|
|
|
|
|
// Evaluate implicit function gradient.
|
|
void vtkImplicitDataSet::EvaluateGradient(double x[3], double n[3])
|
|
{
|
|
vtkDataArray *scalars;
|
|
vtkCell *cell;
|
|
vtkIdType id;
|
|
int subId, i, numPts;
|
|
double pcoords[3];
|
|
|
|
if ( this->DataSet->GetMaxCellSize() > this->Size )
|
|
{
|
|
if ( this->Weights )
|
|
{
|
|
delete [] this->Weights;
|
|
}
|
|
this->Weights = new double[this->DataSet->GetMaxCellSize()];
|
|
this->Size = this->DataSet->GetMaxCellSize();
|
|
}
|
|
|
|
// See if a dataset has been specified
|
|
if ( !this->DataSet ||
|
|
!(scalars = this->DataSet->GetPointData()->GetScalars()) )
|
|
{
|
|
vtkErrorMacro(<<"Can't evaluate gradient!");
|
|
for ( i=0; i < 3; i++ )
|
|
{
|
|
n[i] = this->OutGradient[i];
|
|
}
|
|
return;
|
|
}
|
|
|
|
// Find the cell that contains xyz and get it
|
|
cell = this->DataSet->FindAndGetCell(x,NULL,-1,0.0,subId,pcoords,this->Weights);
|
|
|
|
if (cell)
|
|
{ // Interpolate the point data
|
|
numPts = cell->GetNumberOfPoints();
|
|
|
|
for ( i=0; i < numPts; i++ ) //Weights used to hold scalar values
|
|
{
|
|
id = cell->PointIds->GetId(i);
|
|
this->Weights[i] = scalars->GetComponent(id,0);
|
|
}
|
|
cell->Derivatives(subId, pcoords, this->Weights, 1, n);
|
|
}
|
|
|
|
else
|
|
{ // use outside value
|
|
for ( i=0; i < 3; i++ )
|
|
{
|
|
n[i] = this->OutGradient[i];
|
|
}
|
|
}
|
|
}
|
|
|
|
void vtkImplicitDataSet::PrintSelf(ostream& os, vtkIndent indent)
|
|
{
|
|
this->Superclass::PrintSelf(os,indent);
|
|
|
|
os << indent << "Out Value: " << this->OutValue << "\n";
|
|
os << indent << "Out Gradient: (" << this->OutGradient[0] << ", "
|
|
<< this->OutGradient[1] << ", " << this->OutGradient[2] << ")\n";
|
|
|
|
if ( this->DataSet )
|
|
{
|
|
os << indent << "Data Set: " << this->DataSet << "\n";
|
|
}
|
|
else
|
|
{
|
|
os << indent << "Data Set: (none)\n";
|
|
}
|
|
}
|
|
|
|
//----------------------------------------------------------------------------
|
|
void vtkImplicitDataSet::ReportReferences(vtkGarbageCollector* collector)
|
|
{
|
|
this->Superclass::ReportReferences(collector);
|
|
// These filters share our input and are therefore involved in a
|
|
// reference loop.
|
|
vtkGarbageCollectorReport(collector, this->DataSet, "DataSet");
|
|
}
|
|
|