示例#1
0
    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()
示例#2
0
 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