def enter(self, ray): radius = self.radius # calculate bead center in ray-coordinates x_bead = self.x z_bead = self.radius x_bead_r, z_bead_r = ray_coordinates(ray, x_bead, z_bead) # use equation-of-a-circle to determine intersect point bead_thickness_at_intersect = sqrt(radius**2 - x_bead_r**2) x_intersect_r = 0 z_intersect_r = z_bead_r - bead_thickness_at_intersect # use first derivative of the equation-of-a-circle and snell's law to # calculate the ray bending at the surface theta1_r = atan(x_bead_r/sqrt(radius**2 - x_bead_r**2)) theta2_r = asin(self.n_surround/self.n_bead*sin(theta1_r)) # convert back to standard coordinates x_intersect, z_intersect = standard_coordinates(ray, x_intersect_r, z_intersect_r) theta2 = ray.th + theta2_r ray.x = x_intersect ray.z += z_intersect ray.th = theta2 ray.save()
def intersect(self, ray): x_bead = self.x z_bead = self.radius x_bead_r, z_bead_r = ray_coordinates(ray, x_bead, z_bead) return abs(x_bead_r) < self.radius