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.
 
 
 
 
 
 

200 lines
5.5 KiB

/*=========================================================================
Program: Visualization Toolkit
Module: $RCSfile: vtkVectorNorm.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 "vtkVectorNorm.h"
#include "vtkCellData.h"
#include "vtkDataSet.h"
#include "vtkFloatArray.h"
#include "vtkInformation.h"
#include "vtkInformationVector.h"
#include "vtkObjectFactory.h"
#include "vtkPointData.h"
#include <math.h>
vtkCxxRevisionMacro(vtkVectorNorm, "$Revision: 1.44 $");
vtkStandardNewMacro(vtkVectorNorm);
// Construct with normalize flag off.
vtkVectorNorm::vtkVectorNorm()
{
this->Normalize = 0;
this->AttributeMode = VTK_ATTRIBUTE_MODE_DEFAULT;
}
int vtkVectorNorm::RequestData(
vtkInformation *vtkNotUsed(request),
vtkInformationVector **inputVector,
vtkInformationVector *outputVector)
{
// get the info objects
vtkInformation *inInfo = inputVector[0]->GetInformationObject(0);
vtkInformation *outInfo = outputVector->GetInformationObject(0);
// get the input and ouptut
vtkDataSet *input = vtkDataSet::SafeDownCast(
inInfo->Get(vtkDataObject::DATA_OBJECT()));
vtkDataSet *output = vtkDataSet::SafeDownCast(
outInfo->Get(vtkDataObject::DATA_OBJECT()));
vtkIdType numVectors, i;
int computePtScalars=1, computeCellScalars=1;
vtkFloatArray *newScalars;
double v[3], s, maxScalar;
vtkDataArray *ptVectors, *cellVectors;
vtkPointData *pd=input->GetPointData(), *outPD=output->GetPointData();
vtkCellData *cd=input->GetCellData(), *outCD=output->GetCellData();
// Initialize
vtkDebugMacro(<<"Computing norm of vectors!");
// First, copy the input to the output as a starting point
output->CopyStructure( input );
ptVectors = pd->GetVectors();
cellVectors = cd->GetVectors();
if (!ptVectors || this->AttributeMode == VTK_ATTRIBUTE_MODE_USE_CELL_DATA)
{
computePtScalars = 0;
}
if (!cellVectors || this->AttributeMode == VTK_ATTRIBUTE_MODE_USE_POINT_DATA)
{
computeCellScalars = 0;
}
if ( !computeCellScalars && !computePtScalars )
{
vtkErrorMacro(<< "No vector norm to compute!");
return 1;
}
// Allocate / operate on point data
int abort=0;
vtkIdType progressInterval;
if ( computePtScalars )
{
numVectors = ptVectors->GetNumberOfTuples();
newScalars = vtkFloatArray::New();
newScalars->SetNumberOfTuples(numVectors);
progressInterval=numVectors/10+1;
for (maxScalar=0.0, i=0; i < numVectors && !abort; i++)
{
ptVectors->GetTuple(i, v);
s = sqrt((double)v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);
if ( s > maxScalar )
{
maxScalar = s;
}
newScalars->SetComponent(i,0,s);
if ( ! (i % progressInterval) )
{
vtkDebugMacro(<<"Computing point vector norm #" << i);
this->UpdateProgress (0.5*i/numVectors);
}
}
// If necessary, normalize
if ( this->Normalize && maxScalar > 0.0 )
{
for (i=0; i < numVectors; i++)
{
s = newScalars->GetComponent(i,0);
s /= maxScalar;
newScalars->SetComponent(i,0,s);
}
}
int idx = outPD->AddArray(newScalars);
outPD->SetActiveAttribute(idx, vtkDataSetAttributes::SCALARS);
newScalars->Delete();
outPD->CopyScalarsOff();
}//if computing point scalars
// Allocate / operate on cell data
if ( computeCellScalars )
{
numVectors = cellVectors->GetNumberOfTuples();
newScalars = vtkFloatArray::New();
newScalars->SetNumberOfTuples(numVectors);
progressInterval=numVectors/10+1;
for (maxScalar=0.0, i=0; i < numVectors && !abort; i++)
{
cellVectors->GetTuple(i, v);
s = sqrt((double)v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);
if ( s > maxScalar )
{
maxScalar = s;
}
newScalars->SetComponent(i,0,s);
if ( ! (i % progressInterval) )
{
vtkDebugMacro(<<"Computing cell vector norm #" << i);
this->UpdateProgress (0.5+0.5*i/numVectors);
}
}
// If necessary, normalize
if ( this->Normalize && maxScalar > 0.0 )
{
for (i=0; i < numVectors; i++)
{
s = newScalars->GetComponent(i,0);
s /= maxScalar;
newScalars->SetComponent(i,0,s);
}
}
int idx = outCD->AddArray(newScalars);
outCD->SetActiveAttribute(idx, vtkDataSetAttributes::SCALARS);
newScalars->Delete();
outCD->CopyScalarsOff();
}//if computing cell scalars
// Pass appropriate data through to output
outPD->PassData(pd);
outCD->PassData(cd);
return 1;
}
// Return the method for generating scalar data as a string.
const char *vtkVectorNorm::GetAttributeModeAsString(void)
{
if ( this->AttributeMode == VTK_ATTRIBUTE_MODE_DEFAULT )
{
return "Default";
}
else if ( this->AttributeMode == VTK_ATTRIBUTE_MODE_USE_POINT_DATA )
{
return "UsePointData";
}
else
{
return "UseCellData";
}
}
void vtkVectorNorm::PrintSelf(ostream& os, vtkIndent indent)
{
this->Superclass::PrintSelf(os,indent);
os << indent << "Normalize: " << (this->Normalize ? "On\n" : "Off\n");
os << indent << "Attribute Mode: " << this->GetAttributeModeAsString()
<< endl;
}