82 else if(
m_Dir.z > 0 )
104 else if(
m_Dir.z == 0 )
106 else if(
m_Dir.y == 0 )
128 else if(
m_Dir.z == 0 )
130 else if(
m_Dir.x == 0 )
142 else if(
m_Dir.x == 0 )
144 else if(
m_Dir.y == 0 )
155 else if(
m_Dir.z == 0 )
164 else if(
m_Dir.y == 0 )
166 else if(
m_Dir.z == 0 )
180 float rxs = aEnd_minus_startA.x * aEnd_minus_startB.y - aEnd_minus_startA.y *
183 if(
std::abs( rxs ) > glm::epsilon<float>() )
185 float inv_rxs = 1.0f / rxs;
187 SFVEC2F pq = aStartB - aStartA;
189 float t = ( pq.x * aEnd_minus_startB.y - pq.y * aEnd_minus_startB.x ) * inv_rxs;
191 if( ( t < 0.0f ) || ( t > 1.0f ) )
194 float u = ( pq.x * aEnd_minus_startA.y - pq.y * aEnd_minus_startA.x ) * inv_rxs;
196 if( ( u < 0.0f ) || ( u > 1.0f ) )
208 float &aOutT1 )
const
212 float p_dot_d = glm::dot( OC,
m_Dir );
217 float p_dot_p = glm::dot( OC, OC );
218 float discriminant = p_dot_p - p_dot_d * p_dot_d;
220 if( discriminant > aRadius*aRadius )
223 discriminant = sqrtf( aRadius*aRadius - discriminant );
225 aOutT0 = p_dot_d - discriminant;
226 aOutT1 = p_dot_d + discriminant;
228 if( aOutT0 > aOutT1 )
248 if( fabs(
m_Dir.x ) < FLT_EPSILON )
251 if( fabs(
m_Dir.y ) < FLT_EPSILON )
264 if(
std::abs( rxs ) > glm::epsilon<float>() )
266 const float inv_rxs = 1.0f / rxs;
270 const float t = ( pq.x * aEnd_minus_start.y - pq.y * aEnd_minus_start.x ) * inv_rxs;
272 if( ( t < 0.0f ) || ( t > 1.0f ) )
277 if( ( u < 0.0f ) || ( u > 1.0f ) )
296 if( c1 < FLT_EPSILON )
297 return glm::dot( p, p );
311 return glm::dot( p, p );
316 float *aOutT1,
SFVEC2F *aOutNormalT0,
SFVEC2F *aOutNormalT1 )
const
322 const float qx =
m_Start.x - aCenter.x;
323 const float qy =
m_Start.y - aCenter.y;
326 const float qq = qx * qx + qy * qy;
330 const float discriminantsqr = (qd * qd - (qq - aRadius * aRadius));
333 if( discriminantsqr < FLT_EPSILON )
338 const float discriminant = std::sqrt( discriminantsqr );
339 const float t1 = ( -qd - discriminant );
340 const float t2 = ( -qd + discriminant );
342 if( ( ( t1 < 0.0f ) || ( t1 >
m_Length ) ) && ( ( t2 < 0.0f ) || ( t2 >
m_Length ) ) )
352 *aOutNormalT0 = ( hitPointT1 - aCenter ) / aRadius;
353 *aOutNormalT1 = ( hitPointT2 - aCenter ) / aRadius;
Defines math related functions.
float NextFloatDown(float v)
EDA_ANGLE abs(const EDA_ANGLE &aAngle)
bool IntersectSegment(const SFVEC2F &aStartA, const SFVEC2F &aEnd_minus_startA, const SFVEC2F &aStartB, const SFVEC2F &aEnd_minus_startB)
bool IntersectCircle(const SFVEC2F &aCenter, float aRadius, float *aOutT0, float *aOutT1, SFVEC2F *aOutNormalT0, SFVEC2F *aOutNormalT1) const
bool IntersectSegment(const SFVEC2F &aStart, const SFVEC2F &aEnd_minus_start, float *aOutT) const
float m_DOT_End_minus_start
dot( m_End_minus_start, m_End_minus_start)
float DistanceToPointSquared(const SFVEC2F &aPoint) const
SFVEC2F m_End_minus_start
SFVEC2F at(float t) const
RAYSEG2D(const SFVEC2F &s, const SFVEC2F &e)
void Init(const SFVEC3F &o, const SFVEC3F &d)
unsigned int m_dirIsNeg[3]
RAY_CLASSIFICATION m_Classification
bool IntersectSphere(const SFVEC3F &aCenter, float aRadius, float &aOutT0, float &aOutT1) const
unsigned int rayID
unique ray ID - not used - dummy