You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

203 lines
6.0 KiB
C++

/*=========================================================================
Program: Visualization Toolkit
Module: vtkBSPIntersections.h
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.
=========================================================================*/
/*----------------------------------------------------------------------------
Copyright (c) Sandia Corporation
See Copyright.txt or http://www.paraview.org/HTML/Copyright.html for details.
----------------------------------------------------------------------------*/
/**
* @class vtkBSPIntersections
* @brief Perform calculations (mostly intersection
* calculations) on regions of a 3D binary spatial partitioning.
*
*
* Given an axis aligned binary spatial partitioning described by a
* vtkBSPCuts object, perform intersection queries on various
* geometric entities with regions of the spatial partitioning.
*
* @sa
* vtkBSPCuts vtkKdTree
*/
#ifndef vtkBSPIntersections_h
#define vtkBSPIntersections_h
#include "vtkCommonDataModelModule.h" // For export macro
#include "vtkObject.h"
class vtkTimeStamp;
class vtkCell;
class vtkKdNode;
class vtkBSPCuts;
class VTKCOMMONDATAMODEL_EXPORT vtkBSPIntersections : public vtkObject
{
public:
vtkTypeMacro(vtkBSPIntersections, vtkObject);
void PrintSelf(ostream& os, vtkIndent indent) override;
static vtkBSPIntersections* New();
/**
* Define the binary spatial partitioning.
*/
void SetCuts(vtkBSPCuts* cuts);
vtkGetObjectMacro(Cuts, vtkBSPCuts);
/**
* Get the bounds of the whole space (xmin, xmax, ymin, ymax, zmin, zmax)
* Return 0 if OK, 1 on error.
*/
int GetBounds(double* bounds);
/**
* The number of regions in the binary spatial partitioning
*/
int GetNumberOfRegions();
/**
* Get the spatial bounds of a particular region
* Return 0 if OK, 1 on error.
*/
int GetRegionBounds(int regionID, double bounds[6]);
/**
* Get the bounds of the data within the k-d tree region, possibly
* smaller than the bounds of the region.
* Return 0 if OK, 1 on error.
*/
int GetRegionDataBounds(int regionID, double bounds[6]);
//@{
/**
* Determine whether a region of the spatial decomposition
* intersects an axis aligned box.
*/
int IntersectsBox(int regionId, double* x);
int IntersectsBox(
int regionId, double xmin, double xmax, double ymin, double ymax, double zmin, double zmax);
//@}
//@{
/**
* Compute a list of the Ids of all regions that
* intersect the specified axis aligned box.
* Returns: the number of ids in the list.
*/
int IntersectsBox(int* ids, int len, double* x);
int IntersectsBox(
int* ids, int len, double x0, double x1, double y0, double y1, double z0, double z1);
//@}
/**
* Determine whether a region of the spatial decomposition
* intersects a sphere, given the center of the sphere
* and the square of it's radius.
*/
int IntersectsSphere2(int regionId, double x, double y, double z, double rSquared);
/**
* Compute a list of the Ids of all regions that
* intersect the specified sphere. The sphere is given
* by it's center and the square of it's radius.
* Returns: the number of ids in the list.
*/
int IntersectsSphere2(int* ids, int len, double x, double y, double z, double rSquared);
/**
* Determine whether a region of the spatial decomposition
* intersects the given cell. If you already
* know the region that the cell centroid lies in, provide
* that as the last argument to make the computation quicker.
*/
int IntersectsCell(int regionId, vtkCell* cell, int cellRegion = -1);
/**
* Compute a list of the Ids of all regions that
* intersect the given cell. If you already
* know the region that the cell centroid lies in, provide
* that as the last argument to make the computation quicker.
* Returns the number of regions the cell intersects.
*/
int IntersectsCell(int* ids, int len, vtkCell* cell, int cellRegion = -1);
/**
* When computing the intersection of k-d tree regions with other
* objects, we use the spatial bounds of the region. To use the
* tighter bound of the bounding box of the data within the region,
* set this variable ON. (Specifying data bounds in the vtkBSPCuts
* object is optional. If data bounds were not specified, this
* option has no meaning.)
*/
vtkGetMacro(ComputeIntersectionsUsingDataBounds, int);
void SetComputeIntersectionsUsingDataBounds(int c);
void ComputeIntersectionsUsingDataBoundsOn();
void ComputeIntersectionsUsingDataBoundsOff();
protected:
vtkBSPIntersections();
~vtkBSPIntersections() override;
vtkGetMacro(RegionListBuildTime, vtkMTimeType);
int BuildRegionList();
vtkKdNode** GetRegionList() { return this->RegionList; }
double CellBoundsCache[6]; // to speed cell intersection queries
enum
{
XDIM = 0, // don't change these values
YDIM = 1,
ZDIM = 2
};
private:
static int NumberOfLeafNodes(vtkKdNode* kd);
static void SetIDRanges(vtkKdNode* kd, int& min, int& max);
int SelfRegister(vtkKdNode* kd);
static void SetCellBounds(vtkCell* cell, double* bounds);
int _IntersectsBox(vtkKdNode* node, int* ids, int len, double x0, double x1, double y0, double y1,
double z0, double z1);
int _IntersectsSphere2(
vtkKdNode* node, int* ids, int len, double x, double y, double z, double rSquared);
int _IntersectsCell(vtkKdNode* node, int* ids, int len, vtkCell* cell, int cellRegion = -1);
vtkBSPCuts* Cuts;
int NumberOfRegions;
vtkKdNode** RegionList;
vtkTimeStamp RegionListBuildTime;
int ComputeIntersectionsUsingDataBounds;
vtkBSPIntersections(const vtkBSPIntersections&) = delete;
void operator=(const vtkBSPIntersections&) = delete;
};
#endif