oomph::IntersectionChecker Namespace Reference

Namespace for intersection checker. More...

Functions

bool intersects (const Vector< Vector< double > > &first_segment_vertex, const Vector< Vector< double > > &second_segment_vertex, const double &epsilon_parallel=1.0e-15)
 

Detailed Description

Namespace for intersection checker.

Function Documentation

◆ intersects()

bool oomph::IntersectionChecker::intersects ( const Vector< Vector< double > > &  first_segment_vertex,
const Vector< Vector< double > > &  second_segment_vertex,
const double epsilon_parallel = 1.0e-15 
)

Check if finite-length line segments specified by end points intersect (true) or not (false). From http://paulbourke.net/geometry/lineline2d/ C++ contribution by Damian Coventry.

60  {
61 
62  double denom = ((first_segment_vertex[1][1] - first_segment_vertex[0][1])*
63  (second_segment_vertex[1][0] - second_segment_vertex[0][0])) -
64  ((first_segment_vertex[1][0] - first_segment_vertex[0][0])*
65  (second_segment_vertex[1][1] - second_segment_vertex[0][1]));
66 
67  double nume_a = ((first_segment_vertex[1][0] - first_segment_vertex[0][0])*
68  (second_segment_vertex[0][1] - first_segment_vertex[0][1])) -
69  ((first_segment_vertex[1][1] - first_segment_vertex[0][1])*
70  (second_segment_vertex[0][0] - first_segment_vertex[0][0]));
71 
72  double nume_b = ((second_segment_vertex[1][0] - second_segment_vertex[0][0])*
73  (second_segment_vertex[0][1] - first_segment_vertex[0][1])) -
74  ((second_segment_vertex[1][1] - second_segment_vertex[0][1])*
75  (second_segment_vertex[0][0] - first_segment_vertex[0][0]));
76 
77  if(std::fabs(denom) < epsilon_parallel)
78  {
79  if( (std::fabs(nume_a) < epsilon_parallel) &&
80  (std::fabs(nume_b) < epsilon_parallel) )
81  {
82  return false; //COINCIDENT;
83  }
84  return false; //PARALLEL;
85  }
86 
87  double ua = nume_a / denom;
88  double ub = nume_b / denom;
89 
90  if( (ua >= 0.0) && (ua <= 1.0) && (ub >= 0.0) && (ub <= 1.0) )
91  {
92  /* // Get the intersection point. */
93  /* intersection[0] = second_segment_vertex[0][0] + */
94  /* ua*(second_segment_vertex[1][0] - second_segment_vertex[0][0]); */
95  /* intersection[1] = second_segment_vertex[0][1] + */
96  /* ua*(second_segment_vertex[1][1] - second_segment_vertex[0][1]); */
97 
98  return true; //INTERESECTING;
99  }
100 
101  return false; //NOT_INTERESECTING;
102  }
Real fabs(const Real &a)
Definition: boostmultiprec.cpp:117

References boost::multiprecision::fabs().

Referenced by oomph::StefanBoltzmannHelper::setup_stefan_boltzmann_visibility().