docs: @Pure
  	public static boolean intersectsTriangleSphere(
  			double tx1, double ty1, double tz1,
  			double tx2, double ty2, double tz2,
  			double tx3, double ty3, double tz3,
  			double centerx, double centery, double centerz, 
  			double radius) {
  		// A = A - P
  		double ax = tx1 - centerx;
  		double ay = ty1 - centery;
  		double az = tz1 - centerz;
  		// B = B - P
  		double bx = tx2 - centerx;
  		double by = ty2 - centery;
  		double bz = tz2 - centerz;
  		// C = C - P
  		double cx = tx3 - centerx;
  		double cy = ty3 - centery;
  		double cz = tz3 - centerz;
  		// rr = r * r
  		double rr = radius * radius;
  		// V = cross(B - A, C - A)
  		Vector3f V = new Vector3f();
  		FunctionalVector3D.crossProduct(bx - ax, by - ay, bz - az, cx - ax, cy - ay, cz - az, V);
  		// d = dot(A, V)
  		double d = FunctionalVector3D.dotProduct(ax, ay, az, V.getX(), V.getY(), V.getZ());
  		// e = dot(V, V)
  		double e = V.dot(V);
  		// sep1 = d * d > rr * e
  		if (d * d > rr * e) {
  			return false;
  		}
  		// aa = dot(A, A)
  		double aa = FunctionalVector3D.dotProduct(ax, ay, az, ax, ay, az);
  		// ab = dot(A, B)
  		double ab = FunctionalVector3D.dotProduct(ax, ay, az, bx, by, bz);
  		// ac = dot(A, C)
  		double ac = FunctionalVector3D.dotProduct(ax, ay, az, cx, cy, cz);
  		// bb = dot(B, B)
  		double bb = FunctionalVector3D.dotProduct(bx, by, bz, bx, by, bz);
  		// bc = dot(B, C)
  		double bc = FunctionalVector3D.dotProduct(bx, by, bz, cx, cy, cz);
  		// cc = dot(C, C)
  		double cc = FunctionalVector3D.dotProduct(cx, cy, cz, cx, cy, cz);
  		// sep2 = (aa > rr) & (ab > aa) & (ac > aa)
  		if ((aa > rr) && (ab > aa) && (ac > aa)) {
  			return false;
  		}
  		// sep3 = (bb > rr) & (ab > bb) & (bc > bb)
  		if ((bb > rr) && (ab > bb) && (bc > bb)) {
  			return false;
  		}
  		// sep4 = (cc > rr) & (ac > cc) & (bc > cc)
  		if ((cc > rr) && (ac > cc) && (bc > cc)) {
  			return false;
  		}
  
  		// AB = B - A
  		double abx = bx - ax;
  		double aby = by - ay;
  		double abz = bz - az;
  		// d1 = ab - aa
  		double d1 = ab - aa;
  		// e1 = dot(AB, AB)
  		double e1 = FunctionalVector3D.dotProduct(abx, aby, abz, abx, aby, abz);
  		// Q1 = A * e1 - d1 * AB
  		double q1x = ax * e1 - d1 * abx;
  		double q1y = ay * e1 - d1 * aby;
  		double q1z = az * e1 - d1 * abz;
  		// QC = C * e1 - Q1
  		double qcx = cx * e1 - q1x;
  		double qcy = cy * e1 - q1y;
  		double qcz = cz * e1 - q1z;
  		// sep5 = [dot(Q1, Q1) > rr * e1 * e1] & [dot(Q1, QC) > 0]
  		if ((FunctionalVector3D.dotProduct(q1x, q1y, q1z, q1x, q1y, q1z) > (rr * e1 * e1))
  				&& (FunctionalVector3D.dotProduct(q1x, q1y, q1z, qcx, qcy, qcz) > 0.)) {
  			return false;
  		}
  
  		// BC = C - B
  		double bcx = cx - bx;
  		double bcy = cy - by;
  		double bcz = cz - bz;
  		// d2 = bc - bb
  		double d2 = bc - bb;
  		// e2 = dot(BC, BC)
  		double e2 = FunctionalVector3D.dotProduct(bcx, bcy, bcz, bcx, bcy, bcz);
  		// Q2 = B * e2 - d2 * BC
  		double q2x = bx * e2 - d2 * bcx;
  		double q2y = by * e2 - d2 * bcy;
  		double q2z = bz * e2 - d2 * bcz;
  		// QA = A * e2 - Q2
  		double qax = ax * e2 - q2x;
  		double qay = ay * e2 - q2y;
  		double qaz = az * e2 - q2z;
  		// sep6 = [dot(Q2, Q2) > rr * e2 * e2] & [dot(Q2, QA) > 0]
  		if ((FunctionalVector3D.dotProduct(q2x, q2y, q2z, q2x, q2y, q2z) > (rr * e2 * e2))
  				&& (FunctionalVector3D.dotProduct(q1x, q2y, q2z, qax, qay, qaz) > 0.)) {
  			return false;
  		}
  
  		// CA = A - C
  		double cax = ax - cx;
  		double cay = ay - cy;
  		double caz = az - cz;
  		// d3 = ac - cc
  		double d3 = ac - cc;
  		// e3 = dot(CA, CA)
  		double e3 = FunctionalVector3D.dotProduct(cax, cay, caz, cax, cay, caz);
  		// Q3 = C * e3 - d3 * CA
  		double q3x = cx * e3 - d3 * cax;
  		double q3y = cy * e3 - d3 * cay;
  		double q3z = cz * e3 - d3 * caz;
  		// QB = B * e3 - Q3
  		double qbx = bx * e3 - q3x;
  		double qby = by * e3 - q3y;
  		double qbz = bz * e3 - q3z;
  		// sep7 = [dot(Q3, Q3) > rr * e3 * e3] & [dot(Q3, QB) > 0]
  		if ((FunctionalVector3D.dotProduct(q3x, q3y, q3z, q3x, q3y, q3z) > (rr * e3 * e3))
  				&& (FunctionalVector3D.dotProduct(q3x, q3y, q3z, qbx, qby, qbz) > 0.)) {
  			return false;
  		}
  
  		return true;
  	}