1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
|
// 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
|