/*========================================================================= 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"; }