/*========================================================================= Program: Visualization Toolkit Module: $RCSfile: vtkSimpleElevationFilter.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 "vtkSimpleElevationFilter.h" #include "vtkCellData.h" #include "vtkDataSet.h" #include "vtkFloatArray.h" #include "vtkInformation.h" #include "vtkInformationVector.h" #include "vtkMath.h" #include "vtkObjectFactory.h" #include "vtkPointData.h" vtkCxxRevisionMacro(vtkSimpleElevationFilter, "$Revision: 1.20 $"); vtkStandardNewMacro(vtkSimpleElevationFilter); // Construct object with LowPoint=(0,0,0) and HighPoint=(0,0,1). Scalar // range is (0,1). vtkSimpleElevationFilter::vtkSimpleElevationFilter() { this->Vector[0] = 0.0; this->Vector[1] = 0.0; this->Vector[2] = 1.0; } // Convert position along ray into scalar value. Example use includes // coloring terrain by elevation. // int vtkSimpleElevationFilter::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 i, numPts; vtkFloatArray *newScalars; double s, x[3]; // Initialize // vtkDebugMacro(<<"Generating elevation scalars!"); // First, copy the input to the output as a starting point output->CopyStructure( input ); if ( ((numPts=input->GetNumberOfPoints()) < 1) ) { vtkDebugMacro(<< "No input!"); return 1; } // Allocate // newScalars = vtkFloatArray::New(); newScalars->SetNumberOfTuples(numPts); // Set up 1D parametric system // if ( vtkMath::Dot(this->Vector,this->Vector) == 0.0) { vtkErrorMacro(<< "Bad vector, using (0,0,1)"); this->Vector[0] = this->Vector[1] = 0.0; this->Vector[2] = 1.0; } // Compute dot product // int abort=0; vtkIdType progressInterval=numPts/20 + 1; for (i=0; iUpdateProgress ((double)i/numPts); abort = this->GetAbortExecute(); } input->GetPoint(i,x); s = vtkMath::Dot(this->Vector,x); newScalars->SetComponent(i,0,s); } // Update self // output->GetPointData()->CopyScalarsOff(); output->GetPointData()->PassData(input->GetPointData()); output->GetCellData()->PassData(input->GetCellData()); newScalars->SetName("Elevation"); output->GetPointData()->AddArray(newScalars); output->GetPointData()->SetActiveScalars(newScalars->GetName()); newScalars->Delete(); return 1; } void vtkSimpleElevationFilter::PrintSelf(ostream& os, vtkIndent indent) { this->Superclass::PrintSelf(os,indent); os << indent << "Vector: (" << this->Vector[0] << ", " << this->Vector[1] << ", " << this->Vector[2] << ")\n"; }