//---------------------------------------------------------------------------- // EgalTech 2018-2018 //---------------------------------------------------------------------------- // File : IntersLineSphere.cpp Data : 04.02.18 Versione : 1.9b1 // Contenuto : Implementazione della intersezione linea/sfera. // // // // Modifiche : 04.02.18 DS Creazione modulo. // // //---------------------------------------------------------------------------- //--------------------------- Include ---------------------------------------- #include "stdafx.h" #include "/EgtDev/Include/EGkIntersLineSphere.h" //---------------------------------------------------------------------------- int IntersLineSphere( const Point3d& ptL, const Vector3d& vtL, const Point3d& ptCen, double dRad, Point3d& ptI1, Point3d& ptI2) { // Verifiche su versore linea Vector3d vtDir = vtL ; if ( ! vtDir.Normalize( EPS_ZERO)) return ILST_NO ; // Proiezione del centro della sfera sulla linea Point3d ptP = ptL + (( ptCen - ptL) * vtL) * vtL ; // Quadrato della distanza di questo punto di proiezione dal centro della sfera double dSqDist = SqDist( ptCen, ptP) ; // Differenza tra quadrato del raggio e quadrato della distanza double dSqDelta = dRad * dRad - dSqDist ; // Se distanza superiore al raggio, nessuna intersezione if ( dSqDelta < - 2 * dRad * EPS_SMALL) return ILST_NO ; // Se distanza uguale al raggio, intersezione tangente if ( dSqDelta < EPS_SMALL * EPS_SMALL) { ptI1 = ptP ; ptI2 = ptP ; return ILST_TG ; } // Distanza inferiore al raggio, due intersezioni secanti double dDist2 = sqrt( dSqDelta) ; ptI1 = ptP - dDist2 * vtL ; ptI2 = ptP + dDist2 * vtL ; return ILST_SEC ; }