// SPDX-FileCopyrightText: Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen // SPDX-License-Identifier: BSD-3-Clause /** * @class vtkProjectSphereFilter * @brief A filter to 'unroll' a sphere. The * unroll longitude is -180. * * */ #ifndef vtkProjectSphereFilter_h #define vtkProjectSphereFilter_h #include "vtkFiltersGeometryModule.h" // For export macro #include "vtkPointSetAlgorithm.h" VTK_ABI_NAMESPACE_BEGIN class vtkCell; class vtkCellArray; class vtkDataSetAttributes; class vtkIdList; class vtkIncrementalPointLocator; class vtkUnstructuredGrid; class VTKFILTERSGEOMETRY_EXPORT vtkProjectSphereFilter : public vtkPointSetAlgorithm { public: vtkTypeMacro(vtkProjectSphereFilter, vtkPointSetAlgorithm); void PrintSelf(ostream& os, vtkIndent indent) override; static vtkProjectSphereFilter* New(); ///@{ /** * Set the center of the sphere to be split. Default is 0,0,0. */ vtkSetVector3Macro(Center, double); vtkGetVectorMacro(Center, double, 3); ///@} ///@{ /** * Specify whether or not to keep the cells using a point at * a pole. The default is false. */ vtkGetMacro(KeepPolePoints, bool); vtkSetMacro(KeepPolePoints, bool); vtkBooleanMacro(KeepPolePoints, bool); ///@} ///@{ /** * Specify whether (true) or not to translate the points in the projected * transformation such that the input point with the smallest * radius is at 0. The default is false. */ vtkGetMacro(TranslateZ, bool); vtkSetMacro(TranslateZ, bool); vtkBooleanMacro(TranslateZ, bool); ///@} protected: vtkProjectSphereFilter(); ~vtkProjectSphereFilter() override; int FillInputPortInformation(int port, vtkInformation* info) override; int RequestData(vtkInformation*, vtkInformationVector**, vtkInformationVector*) override; void TransformPointInformation(vtkPointSet* input, vtkPointSet* output, vtkIdList*); void TransformCellInformation(vtkPointSet* input, vtkPointSet* output, vtkIdList*); void TransformTensors(vtkIdType id, double* coord, vtkDataSetAttributes* arrays); /** * Parallel part of the algorithm to figure out the closest point * to the centerline (i.e. line connecting -90 latitude to 90 latitude) * if we don't build cells using points at the poles. */ virtual void ComputePointsClosestToCenterLine(double, vtkIdList*) {} /** * If TranslateZ is true then this is the method that computes * the amount to translate. */ virtual double GetZTranslation(vtkPointSet* input); /** * Split a cell into multiple cells because it stretches across the * SplitLongitude. splitSide is 1 for left side and 0 for sight side. */ void SplitCell(vtkPointSet* input, vtkPointSet* output, vtkIdType inputCellId, vtkIncrementalPointLocator* locator, vtkCellArray* connectivity, int splitSide); void SetCellInformation(vtkUnstructuredGrid* output, vtkCell* cell, vtkIdType numberOfNewCells); private: vtkProjectSphereFilter(const vtkProjectSphereFilter&) = delete; void operator=(const vtkProjectSphereFilter&) = delete; double Center[3]; const double SplitLongitude; bool KeepPolePoints; bool TranslateZ; }; VTK_ABI_NAMESPACE_END #endif // vtkProjectSphereFilter_h