IGL_INLINE void igl::project_to_line_segment( const Eigen::MatrixBase<DerivedP> & P, const Eigen::MatrixBase<DerivedS> & S, const Eigen::MatrixBase<DerivedD> & D, Eigen::PlainObjectBase<Derivedt> & t, Eigen::PlainObjectBase<DerivedsqrD> & sqrD) { project_to_line(P,S,D,t,sqrD); const int np = P.rows(); // loop over points and fix those that projected beyond endpoints #pragma omp parallel for if (np>10000) for(int p = 0;p<np;p++) { const DerivedP Pp = P.row(p); if(t(p)<0) { sqrD(p) = (Pp-S).squaredNorm(); t(p) = 0; }else if(t(p)>1) { sqrD(p) = (Pp-D).squaredNorm(); t(p) = 1; } } }
point line_circle_intersect(const line &l, const circle &c) { double x = sqrt(sqr(c.radius) - sqr(point_to_line(c.center, l))); return project_to_line(c.center, l) + (l.s - l.t).unit() * x; }