Intersection intersect(Ray r, num prevBestDistance)

Performs a ray - primitive intersection test. Returns an Intersection object with the associated information.

If the ray did not hit the primitive, the distance will be negative.

Source

Intersection intersect(Ray r, num prevBestDistance) {
  Intersection intersect = new Intersection();

  /*
  vec3 distance = r.origin-this.center;
  double B = distance.dot(r.direction);
  double C = B*B - distance.length2 + (this.radius*this.radius);
  double l1 = C >= 0.0 ? -B - sqrt(C) : -1.0;

  if (l1 < 0) {
    return intersect;
  } else {
    intersect.distance = l1;
    intersect.hitPoint = r.getPoint3(l1);
    intersect.prim = this;
    return intersect;
  }
  */

  num A = r.direction.dot(r.direction);
  num B = (r.origin - this.center).dot(r.direction) * 2;
  num C = (r.origin - this.center).dot(r.origin - this.center) - (this.radius * this.radius);
  num det = B * B - 4 * A * C;

  if (det >= 0) {
    num sol1 = (-B + Math.sqrt(det)) / (2 * A);
    num sol2 = (-B - Math.sqrt(det)) / (2 * A);

    num minDist,maxDist;
    if (sol1 >= sol2) {
      maxDist = sol1;
      minDist = sol2;
    }else{
      maxDist = sol2;
      minDist = sol1;
    }

    num dist = minDist > EPS ? minDist : maxDist;

    intersect.distance = dist;
    intersect.prim = this;
    intersect.hitPoint = r.getPoint3(dist);
  }

  return intersect;
}