VTK  9.2.6
vtkIntersectionCounter.h
Go to the documentation of this file.
1 
19 #ifndef vtkIntersectionCounter_h
20 #define vtkIntersectionCounter_h
21 
22 #include "vtkCommonDataModelModule.h" // For export macro
23 #include "vtkSystemIncludes.h"
24 #include <algorithm> // for sorting
25 #include <vector> // for implementation
26 
27 // class VTKCOMMONDATAMODEL_EXPORT vtkIntersectionCounter
28 
30 {
31 public:
33 
38  : Tolerance(0.0001)
39  {
40  }
41  vtkIntersectionCounter(double tol, double length)
42  {
43  this->Tolerance = (length > 0.0 ? (tol / length) : 0.0);
44  }
46 
50  void SetTolerance(double tol) { this->Tolerance = (tol < 0.0 ? 0.0001 : tol); }
51  double GetTolerance() { return this->Tolerance; }
52 
56  void AddIntersection(double t) { IntsArray.push_back(t); }
57 
61  void Reset() { IntsArray.clear(); }
62 
69  {
70  int size = static_cast<int>(IntsArray.size());
71 
72  // Fast check for trivial cases
73  if (size <= 1)
74  {
75  return size; // 0 or 1
76  }
77 
78  // Need to work harder: sort and then count the intersections
79  std::sort(IntsArray.begin(), IntsArray.end());
80 
81  // If here, there is at least one intersection, and two inserted
82  // intersection points
83  int numInts = 1;
84  std::vector<double>::iterator i0 = IntsArray.begin();
85  std::vector<double>::iterator i1 = i0 + 1;
86 
87  // Now march through sorted array counting "separated" intersections
88  while (i1 != IntsArray.end())
89  {
90  if ((*i1 - *i0) > this->Tolerance)
91  {
92  numInts++;
93  i0 = i1;
94  }
95  i1++;
96  }
97 
98  return numInts;
99  }
100 
101 protected:
102  double Tolerance;
103  std::vector<double> IntsArray;
104 
105 }; // vtkIntersectionCounter
106 
107 #endif
108 // VTK-HeaderTest-Exclude: vtkIntersectionCounter.h
void Reset()
Reset the intersection process.
std::vector< double > IntsArray
vtkIntersectionCounter()
This tolerance must be converted to parametric space.
int CountIntersections()
Returns number of intersections (even number of intersections, outside or odd number of intersections...
Fast simple class for dealing with ray intersections.
vtkIntersectionCounter(double tol, double length)
This tolerance must be converted to parametric space.
void AddIntersection(double t)
Add an intersection given by parametric coordinate t.
void SetTolerance(double tol)
Set/Get the intersection tolerance.