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
203 lines
6.0 KiB
C
3 weeks ago
|
/*=========================================================================
|
||
|
|
||
|
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
|