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.
 
 
 
 
 
 

149 lines
3.8 KiB

/*=========================================================================
Program: Visualization Toolkit
Module: $RCSfile: vtkVectorDot.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 "vtkVectorDot.h"
#include "vtkDataSet.h"
#include "vtkFloatArray.h"
#include "vtkInformation.h"
#include "vtkInformationVector.h"
#include "vtkMath.h"
#include "vtkObjectFactory.h"
#include "vtkPointData.h"
vtkCxxRevisionMacro(vtkVectorDot, "$Revision: 1.39 $");
vtkStandardNewMacro(vtkVectorDot);
// Construct object with scalar range is (-1,1).
vtkVectorDot::vtkVectorDot()
{
this->ScalarRange[0] = -1.0;
this->ScalarRange[1] = 1.0;
}
//
// Compute dot product.
//
int vtkVectorDot::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 ptId, numPts;
vtkFloatArray *newScalars;
vtkDataArray *inNormals;
vtkDataArray *inVectors;
double s, n[3], v[3], min, max, dR, dS;
vtkPointData *pd=input->GetPointData(), *outPD=output->GetPointData();
// Initialize
//
vtkDebugMacro(<<"Generating vector/normal dot product!");
// First, copy the input to the output as a starting point
output->CopyStructure( input );
if ( (numPts=input->GetNumberOfPoints()) < 1 )
{
vtkErrorMacro(<< "No points!");
return 1;
}
if ( (inVectors=pd->GetVectors()) == NULL )
{
vtkErrorMacro(<< "No vectors defined!");
return 1;
}
if ( (inNormals=pd->GetNormals()) == NULL )
{
vtkErrorMacro(<< "No normals defined!");
return 1;
}
// Allocate
//
newScalars = vtkFloatArray::New();
newScalars->Allocate(numPts);
// Compute initial scalars
//
int abort=0;
vtkIdType progressInterval=numPts/20 + 1;
for (min=VTK_DOUBLE_MAX,max=(-VTK_DOUBLE_MAX),ptId=0;
ptId < numPts && !abort; ptId++)
{
if ( ! (ptId % progressInterval) )
{
this->UpdateProgress ((double)ptId/numPts);
abort = this->GetAbortExecute();
}
inNormals->GetTuple(ptId, n);
inVectors->GetTuple(ptId, v);
s = vtkMath::Dot(n,v);
if ( s < min )
{
min = s;
}
if ( s > max )
{
max = s;
}
newScalars->InsertTuple(ptId,&s);
}
// Map scalars into scalar range
//
if ( (dR=this->ScalarRange[1]-this->ScalarRange[0]) == 0.0 )
{
dR = 1.0;
}
if ( (dS=max-min) == 0.0 )
{
dS = 1.0;
}
for ( ptId=0; ptId < numPts; ptId++ )
{
s = newScalars->GetComponent(ptId,0);
s = ((s - min)/dS) * dR + this->ScalarRange[0];
newScalars->InsertTuple(ptId,&s);
}
// Update self and relase memory
//
outPD->PassData(input->GetPointData());
int idx = outPD->AddArray(newScalars);
outPD->SetActiveAttribute(idx, vtkDataSetAttributes::SCALARS);
newScalars->Delete();
return 1;
}
void vtkVectorDot::PrintSelf(ostream& os, vtkIndent indent)
{
this->Superclass::PrintSelf(os,indent);
os << indent << "Scalar Range: (" << this->ScalarRange[0] << ", "
<< this->ScalarRange[1] << ")\n";
}