docs: @Pure
  	public static double getTriangleSegmentIntersectionFactorWithBadouelAlgorithm(
  			double tx1, double ty1, double tz1,
  			double tx2, double ty2, double tz2,
  			double tx3, double ty3, double tz3,
  			double sx1, double sy1, double sz1,
  			double sx2, double sy2, double sz2) {
  		// Compute the vectors of the triangle
  		double ux = tx2 - tx1;
  		double uy = ty2 - ty1;
  		double uz = tz2 - tz1;
  
  		double vx = tx3 - tx1;
  		double vy = ty3 - ty1;
  		double vz = tz3 - tz1;
  
  		// Components of the triangle's plane equation
  		double a = uy * vz - uz * vy;
  		double b = uz * vx - ux * vz;
  		double c = ux * vy - uy * vx;
  		double d = - a * tx1 - b * ty1 - c * tz1;
  
  		double factor = AbstractPlane4F.getIntersectionFactorPlaneSegment(
  				a, b, c, d,
  				sx1, sy1, sz1, sx2, sy2, sz2);
  
  		if (Double.isInfinite(factor)) {
  			// The problem may be expressed as a 2D intersection between the segment and the triangle
  			factor = Double.NaN;
  		} else if (!Double.isNaN(factor)) {
  			// Compute the vector from the first point of the triangle and the point I.
  			double wx = (sx1 + factor * (sx2 - sx1)) - tx1;
  			double wy = (sy1 + factor * (sy2 - sy1)) - ty1;
  			double wz = (sz1 + factor * (sz2 - sz1)) - tz1;
  
  			// Compute dot products
  			double uv = FunctionalVector3D.dotProduct(ux, uy, uz, vx, vy, vz);
  			double uu = FunctionalVector3D.dotProduct(ux, uy, uz, ux, uy, uz);
  			double vv = FunctionalVector3D.dotProduct(vx, vy, vz, vx, vy, vz);
  			double wv = FunctionalVector3D.dotProduct(wx, wy, wz, vx, vy, vz);
  			double wu = FunctionalVector3D.dotProduct(wx, wy, wz, ux, uy, uz);
  
  			// Compute the barycentric coordinates (s, t),
  			// using the generalized perp operator on the point I.
  			double denom = uv * uv - uu * vv;
  			assert (denom != 0.);
  			double s = (uv * wv) - (vv * wu) / denom;
  			if (s >= 0. && s <= 1) {
  				double t = (uv * wu) - (uu * wv) / denom;
  				if (t < 0. || t >= 1.) {
  					factor = Double.NaN;
  				}
  			} else {
  				factor = Double.NaN;
  			}
  		}
  
  		return factor;
  	}