def get_ray(self, s: float, t: float) -> Ray: rd: Vec3 = Vec3.random_in_unit_disk() * self.lens_radius offset: Vec3 = self.u * rd.x() + self.v * rd.y() return Ray( self.origin + offset, (self.lower_left_corner + self.horizontal*s + self.vertical*t - self.origin - offset) )
def get_ray(self, s, t): if len(s) != len(t): raise ValueError rd = Vec3.random_in_unit_disk(len(s)) * self.lens_radius u = Vec3List.from_vec3(self.u, len(s)) v = Vec3List.from_vec3(self.v, len(s)) offset_list = u.mul_ndarray(rd[0]) + v.mul_ndarray(rd[1]) origin_list = offset_list + self.origin horizontal_multi = Vec3List.from_vec3(self.horizontal, len(s)) vertical_multi = Vec3List.from_vec3(self.vertical, len(s)) direction_list = (horizontal_multi.mul_ndarray(s) - vertical_multi.mul_ndarray(t) + self.top_left_corner - self.origin - offset_list) return RayList(origin_list, direction_list)