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
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;
|
|
}
|
|
|