Example #1
0
Ray Sphere::randomRay(const Vector3D &from_point) const {
  double sin_a = radius_ / (center_ - from_point).len();

  double theta = 2 * PI * rand() / RAND_MAX;
  double phi = asin(sqrt(sin_a * sin_a * rand() / RAND_MAX));

  Vector3D dir = (center_ - from_point).normalized();

  Vector3D u = dir.orthogonal().normalized();
  Vector3D v = Vector3D::cross(dir, u);

  return Ray(
      from_point,
      cos(phi) * dir + sin(phi) * cos(theta) * u + sin(phi) * sin(theta) * v);
}