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