/*========================================================================= Program: Visualization Toolkit Module: vtkPlanesIntersection.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 vtkPlanesIntersection * @brief A vtkPlanesIntersection object is a * vtkPlanes object that can compute whether the arbitrary convex region * bounded by it's planes intersects an axis-aligned box. * * * A subclass of vtkPlanes, this class determines whether it * intersects an axis aligned box. This is motivated by the * need to intersect the axis aligned region of a spacial * decomposition of volume data with various other regions. * It uses the algorithm from Graphics Gems IV, page 81. * * @par Caveat: * An instance of vtkPlanes can be redefined by changing the planes, * but this subclass then will not know if the region vertices are * up to date. (Region vertices can be specified in SetRegionVertices * or computed by the subclass.) So Delete and recreate if you want * to change the set of planes. * */ #ifndef vtkPlanesIntersection_h #define vtkPlanesIntersection_h #include "vtkCommonDataModelModule.h" // For export macro #include "vtkPlanes.h" class vtkPoints; class vtkPointsProjectedHull; class vtkCell; class VTKCOMMONDATAMODEL_EXPORT vtkPlanesIntersection : public vtkPlanes { vtkTypeMacro(vtkPlanesIntersection, vtkPlanes); public: void PrintSelf(ostream& os, vtkIndent indent) override; static vtkPlanesIntersection *New(); /** * It helps if you know the vertices of the convex region. * If you don't, we will calculate them. Region vertices * are 3-tuples. */ void SetRegionVertices(vtkPoints *pts); void SetRegionVertices(double *v, int nvertices); int GetNumberOfRegionVertices(); // Retained for backward compatibility int GetNumRegionVertices() { return this->GetNumberOfRegionVertices(); } int GetRegionVertices(double *v, int nvertices); /** * Return 1 if the axis aligned box defined by R intersects * the region defined by the planes, or 0 otherwise. */ int IntersectsRegion(vtkPoints *R); /** * A convenience function provided by this class, returns * 1 if the polygon defined in pts intersects the bounding * box defined in bounds, 0 otherwise. * The points must define a planar polygon. */ static int PolygonIntersectsBBox(double bounds[6], vtkPoints *pts); /** * Another convenience function provided by this class, returns * the vtkPlanesIntersection object representing a 3D * cell. The point IDs for each face must be given in * counter-clockwise order from the outside of the cell. */ static vtkPlanesIntersection *Convert3DCell(vtkCell *cell); protected: static void ComputeNormal(double *p1, double *p2, double *p3, double normal[3]); static double EvaluatePlaneEquation(double *x, double *p); static void PlaneEquation(double *n, double *x, double *p); static int GoodNormal(double *n); static int Invert3x3(double M[3][3]); vtkPlanesIntersection(); ~vtkPlanesIntersection() override; private: int IntersectsBoundingBox(vtkPoints *R); int EnclosesBoundingBox(vtkPoints *R); int EvaluateFacePlane(int plane, vtkPoints *R); int IntersectsProjection(vtkPoints *R, int direction); void SetPlaneEquations(); void ComputeRegionVertices(); void planesMatrix(int p1, int p2, int p3, double M[3][3]) const; int duplicate(double testv[3]) const; void planesRHS(int p1, int p2, int p3, double r[3]) const; int outsideRegion(double v[3]) ; // plane equations double *Planes; // vertices of convex regions enclosed by the planes, also // the ccw hull of that region projected in 3 orthog. directions vtkPointsProjectedHull *RegionPts; vtkPlanesIntersection(const vtkPlanesIntersection&) = delete; void operator=(const vtkPlanesIntersection&) = delete; }; #endif