/*========================================================================= Program: Visualization Toolkit Module: $RCSfile: vtkWarpTo.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 "vtkWarpTo.h" #include "vtkInformation.h" #include "vtkInformationVector.h" #include "vtkMath.h" #include "vtkObjectFactory.h" #include "vtkPointData.h" #include "vtkPointSet.h" #include "vtkPoints.h" vtkCxxRevisionMacro(vtkWarpTo, "$Revision: 1.42 $"); vtkStandardNewMacro(vtkWarpTo); vtkWarpTo::vtkWarpTo() { this->ScaleFactor = 0.5; this->Absolute = 0; this->Position[0] = this->Position[1] = this->Position[2] = 0.0; } int vtkWarpTo::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 vtkPointSet *input = vtkPointSet::SafeDownCast( inInfo->Get(vtkDataObject::DATA_OBJECT())); vtkPointSet *output = vtkPointSet::SafeDownCast( outInfo->Get(vtkDataObject::DATA_OBJECT())); vtkPoints *inPts; vtkPoints *newPts; vtkIdType ptId, numPts; int i; double x[3], newX[3]; double mag; double minMag = 0; vtkDebugMacro(<<"Warping data to a point"); // First, copy the input to the output as a starting point output->CopyStructure( input ); inPts = input->GetPoints(); if (!inPts ) { vtkErrorMacro(<<"No input data"); return 1; } numPts = inPts->GetNumberOfPoints(); newPts = vtkPoints::New(); newPts->SetNumberOfPoints(numPts); if (this->Absolute) { minMag = 1.0e10; for (ptId=0; ptId < numPts; ptId++) { inPts->GetPoint(ptId, x); mag = sqrt(vtkMath::Distance2BetweenPoints(this->Position,x)); if (mag < minMag) { minMag = mag; } } } // // Loop over all points, adjusting locations // for (ptId=0; ptId < numPts; ptId++) { inPts->GetPoint(ptId, x); if (this->Absolute) { mag = sqrt(vtkMath::Distance2BetweenPoints(this->Position,x)); for (i=0; i<3; i++) { newX[i] = this->ScaleFactor* (this->Position[i] + minMag*(x[i] - this->Position[i])/mag) + (1.0 - this->ScaleFactor)*x[i]; } } else { for (i=0; i<3; i++) { newX[i] = (1.0 - this->ScaleFactor)*x[i] + this->ScaleFactor*this->Position[i]; } } newPts->SetPoint(ptId, newX); } // // Update ourselves and release memory // output->GetPointData()->CopyNormalsOff(); // distorted geometry output->GetPointData()->PassData(input->GetPointData()); output->SetPoints(newPts); newPts->Delete(); return 1; } void vtkWarpTo::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os,indent); os << indent << "Absolute: " << (this->Absolute ? "On\n" : "Off\n"); os << indent << "Position: (" << this->Position[0] << ", " << this->Position[1] << ", " << this->Position[2] << ")\n"; os << indent << "Scale Factor: " << this->ScaleFactor << "\n"; }