def hit_test(self):
        x = np.array([100.1, 0.1, 0.1])
        y = np.array([0.1, 100.1, 0.1])
        z = np.array([0.1, 0.1, 100.1])
        o = np.array([0.1, 0.1, 0.1])

        white_Lambert = scene.Boundary(sampler.UniformHemisphere(),
                                       sampler.KentSphere(),
                                       scene.Lambertian(), sampler.RGB())

        T1 = scene.Triangle([x, y, z], white_Lambert, 'T1')
        T2 = scene.Triangle([x, o, y], white_Lambert, 'T2')
        T3 = scene.Triangle([y, o, z], white_Lambert, 'T3')
        T4 = scene.Triangle([z, o, x], white_Lambert, 'T4')

        S1 = scene.Surface({T1, T2, T3, T4})

        point1 = np.array([100.1, 100.1, 100.1])
        point2 = np.array([0, 0, 0])
        point3 = np.array([1, 1, 1])

        embeddedpoint1 = scene.EmbeddedPoint(point1, None)
        embeddedpoint2 = scene.EmbeddedPoint(point2, None)
        embeddedpoint3 = scene.EmbeddedPoint(point3, None)

        direction = np.array([1.1, 2.1, 3.1])

        self.assertTrue(S1.hit(embeddedpoint1, direction) is None)
        self.assertTrue(S1.hit(embeddedpoint2, direction).piece is T3)
        self.assertTrue(S1.hit(embeddedpoint3, direction).piece is T1)
    def run_test(self):
        x = np.array([100, 0, 0])
        y = np.array([0, 100, 0])
        z = np.array([0, 0, 100])
        o = np.array([0, 0, 0])

        a = np.array([200, 0, 0])
        b = np.array([0, 200, 0])
        c = np.array([0, 0, 200])

        white_Lambert = scene.Boundary(sampler.UniformHemisphere(),
                                       sampler.KentSphere(),
                                       scene.Lambertian(), sampler.RGB())

        white_light_atom = scene.Boundary(sampler.UniformSphere(),
                                          sampler.KentSphere(),
                                          scene.Atomic(sampler.RGB(), 1),
                                          sampler.RGB())

        T1 = scene.Triangle([x, y, z], white_Lambert, 'T1')
        T2 = scene.Triangle([x, o, y], white_Lambert, 'T2')
        T3 = scene.Triangle([y, o, z], white_Lambert, 'T3')
        T4 = scene.Triangle([z, o, x], white_Lambert, 'T4')

        C1 = scene.Triangle([o - 50, a - 50, b - 50], white_Lambert, 'C1')
        C2 = scene.Triangle([a - 50, a + b - 50, b - 50], white_Lambert, 'C2')
        C3 = scene.Triangle([o - 50, c - 50, a - 50], white_Lambert, 'C3')
        C4 = scene.Triangle([a - 50, c - 50, a + c - 50], white_Lambert, 'C4')
        C5 = scene.Triangle([o - 50, b - 50, c - 50], white_Lambert, 'C5')
        C6 = scene.Triangle([c - 50, b - 50, b + c - 50], white_Lambert, 'C6')
        C7 = scene.Triangle([a - 50, a + c - 50, a + b - 50], white_Lambert,
                            'C7')
        C8 = scene.Triangle([a + b - 50, a + c - 50, a + b + c - 50],
                            white_Lambert, 'C8')
        C9 = scene.Triangle([b - 50, a + b - 50, b + c - 50], white_Lambert,
                            'C9')
        C10 = scene.Triangle([b + c - 50, a + b - 50, a + b + c - 50],
                             white_Lambert, 'C10')
        C11 = scene.Triangle([c - 50, b + c - 50, a + c - 50], white_Lambert,
                             'C11')
        C12 = scene.Triangle([a + c - 50, b + c - 50, a + b + c - 50],
                             white_Lambert, 'C12')

        eye = scene.DiracEye(np.array([120, -20, 50]), np.array([-1, 1, 0]),
                             np.array([0, 0, 1]))
        light = scene.Dirac(np.array([120, 120, 50]), white_light_atom)

        S1 = scene.Surface({
            T1, T2, T3, T4, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12,
            eye, light
        })

        pixel_number = 100
    def cast_test(self):
        x = np.array([100.1, 0.1, 0.1])
        y = np.array([0.1, 100.1, 0.1])
        z = np.array([0.1, 0.1, 100.1])
        o = np.array([0.1, 0.1, 0.1])

        a = np.array([200, 0, 0])
        b = np.array([0, 200, 0])
        c = np.array([0, 0, 200])

        white_Lambert = scene.Boundary(sampler.UniformHemisphere(),
                                       sampler.KentSphere(),
                                       scene.Lambertian(), sampler.RGB())

        T1 = scene.Triangle([x, y, z], white_Lambert, 'T1')
        T2 = scene.Triangle([x, o, y], white_Lambert, 'T2')
        T3 = scene.Triangle([y, o, z], white_Lambert, 'T3')
        T4 = scene.Triangle([z, o, x], white_Lambert, 'T4')

        C1 = scene.Triangle([o - 50, a - 50, b - 50], white_Lambert, 'C1')
        C2 = scene.Triangle([a - 50, a + b - 50, b - 50], white_Lambert, 'C2')
        C3 = scene.Triangle([o - 50, c - 50, a - 50], white_Lambert, 'C3')
        C4 = scene.Triangle([a - 50, c - 50, a + c - 50], white_Lambert, 'C4')
        C5 = scene.Triangle([o - 50, b - 50, c - 50], white_Lambert, 'C5')
        C6 = scene.Triangle([c - 50, b - 50, b + c - 50], white_Lambert, 'C6')
        C7 = scene.Triangle([a - 50, a + c - 50, a + b - 50], white_Lambert,
                            'C7')
        C8 = scene.Triangle([a + b - 50, a + c - 50, a + b + c - 50],
                            white_Lambert, 'C8')
        C9 = scene.Triangle([b - 50, a + b - 50, b + c - 50], white_Lambert,
                            'C9')
        C10 = scene.Triangle([b + c - 50, a + b - 50, a + b + c - 50],
                             white_Lambert, 'C10')
        C11 = scene.Triangle([c - 50, b + c - 50, a + c - 50], white_Lambert,
                             'C11')
        C12 = scene.Triangle([a + c - 50, b + c - 50, a + b + c - 50],
                             white_Lambert, 'C12')

        S1 = scene.Surface({
            T1, T2, T3, T4, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12
        })

        embeddedpoint = scene.EmbeddedPoint(np.array([0, 0, -50]), C1)
        hit_list = S1.cast(20, embeddedpoint)
        self.assertTrue(len(hit_list) == 21)
        for i in range(20):
            self.assertFalse(hit_list[i].piece is hit_list[i + 1].piece)
            self.assertTrue(
                hit_list[i].piece.boundary is hit_list[i + 1].piece.boundary)
    def see_test(self):
        x = np.array([100, 0, 0])
        y = np.array([0, 100, 0])
        z = np.array([0, 0, 100])
        o = np.array([0, 0, 0])

        a = np.array([200, 0, 0])
        b = np.array([0, 200, 0])
        c = np.array([0, 0, 200])

        white_Lambert = scene.Boundary(sampler.UniformHemisphere(),
                                       sampler.KentSphere(),
                                       scene.Lambertian(), sampler.RGB())

        T1 = scene.Triangle([x, y, z], white_Lambert, 'T1')
        T2 = scene.Triangle([x, o, y], white_Lambert, 'T2')
        T3 = scene.Triangle([y, o, z], white_Lambert, 'T3')
        T4 = scene.Triangle([z, o, x], white_Lambert, 'T4')

        C1 = scene.Triangle([o - 50, a - 50, b - 50], white_Lambert, 'C1')
        C2 = scene.Triangle([a - 50, a + b - 50, b - 50], white_Lambert, 'C2')
        C3 = scene.Triangle([o - 50, c - 50, a - 50], white_Lambert, 'C3')
        C4 = scene.Triangle([a - 50, c - 50, a + c - 50], white_Lambert, 'C4')
        C5 = scene.Triangle([o - 50, b - 50, c - 50], white_Lambert, 'C5')
        C6 = scene.Triangle([c - 50, b - 50, b + c - 50], white_Lambert, 'C6')
        C7 = scene.Triangle([a - 50, a + c - 50, a + b - 50], white_Lambert,
                            'C7')
        C8 = scene.Triangle([a + b - 50, a + c - 50, a + b + c - 50],
                            white_Lambert, 'C8')
        C9 = scene.Triangle([b - 50, a + b - 50, b + c - 50], white_Lambert,
                            'C9')
        C10 = scene.Triangle([b + c - 50, a + b - 50, a + b + c - 50],
                             white_Lambert, 'C10')
        C11 = scene.Triangle([c - 50, b + c - 50, a + c - 50], white_Lambert,
                             'C11')
        C12 = scene.Triangle([a + c - 50, b + c - 50, a + b + c - 50],
                             white_Lambert, 'C12')

        point1 = np.array([0, 0, -50])
        point2 = np.array([1, 1, -50])
        point3 = np.array([33, 33, 34])
        point4 = np.array([49, 49, 0])

        S1 = scene.Surface({
            T1, T2, T3, T4, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12
        })

        embeddedpoint1 = scene.EmbeddedPoint(point1, C1)
        embeddedpoint2 = scene.EmbeddedPoint(point2, None)
        embeddedpoint3 = scene.EmbeddedPoint(point3, T1)
        embeddedpoint4 = scene.EmbeddedPoint(point3, None)
        embeddedpoint5 = scene.EmbeddedPoint(point4, T2)

        self.assertFalse(S1.see(embeddedpoint1, embeddedpoint1))
        self.assertFalse(S1.see(embeddedpoint1, embeddedpoint2))
        self.assertFalse(S1.see(embeddedpoint2, embeddedpoint1))
        self.assertFalse(S1.see(embeddedpoint1, embeddedpoint3))
        self.assertFalse(S1.see(embeddedpoint2, embeddedpoint3))
        self.assertFalse(S1.see(embeddedpoint1, embeddedpoint4))
        self.assertFalse(S1.see(embeddedpoint2, embeddedpoint4))
        self.assertFalse(S1.see(embeddedpoint4, embeddedpoint2))
        self.assertTrue(S1.see(embeddedpoint1, embeddedpoint5))
        self.assertTrue(S1.see(embeddedpoint2, embeddedpoint5))
        self.assertTrue(S1.see(embeddedpoint5, embeddedpoint1))
        self.assertFalse(S1.see(embeddedpoint5, embeddedpoint2))
    def join_test(self):
        x = np.array([100, 0, 0])
        y = np.array([0, 100, 0])
        z = np.array([0, 0, 100])
        o = np.array([0, 0, 0])

        a = np.array([200, 0, 0])
        b = np.array([0, 200, 0])
        c = np.array([0, 0, 200])

        white_Lambert = scene.Boundary(sampler.UniformHemisphere(),
                                       sampler.KentSphere(),
                                       scene.Lambertian(), sampler.RGB())

        T1 = scene.Triangle([x, y, z], white_Lambert, 'T1')
        T2 = scene.Triangle([x, o, y], white_Lambert, 'T2')
        T3 = scene.Triangle([y, o, z], white_Lambert, 'T3')
        T4 = scene.Triangle([z, o, x], white_Lambert, 'T4')

        C1 = scene.Triangle([o - 50, a - 50, b - 50], white_Lambert, 'C1')
        C2 = scene.Triangle([a - 50, a + b - 50, b - 50], white_Lambert, 'C2')
        C3 = scene.Triangle([o - 50, c - 50, a - 50], white_Lambert, 'C3')
        C4 = scene.Triangle([a - 50, c - 50, a + c - 50], white_Lambert, 'C4')
        C5 = scene.Triangle([o - 50, b - 50, c - 50], white_Lambert, 'C5')
        C6 = scene.Triangle([c - 50, b - 50, b + c - 50], white_Lambert, 'C6')
        C7 = scene.Triangle([a - 50, a + c - 50, a + b - 50], white_Lambert,
                            'C7')
        C8 = scene.Triangle([a + b - 50, a + c - 50, a + b + c - 50],
                            white_Lambert, 'C8')
        C9 = scene.Triangle([b - 50, a + b - 50, b + c - 50], white_Lambert,
                            'C9')
        C10 = scene.Triangle([b + c - 50, a + b - 50, a + b + c - 50],
                             white_Lambert, 'C10')
        C11 = scene.Triangle([c - 50, b + c - 50, a + c - 50], white_Lambert,
                             'C11')
        C12 = scene.Triangle([a + c - 50, b + c - 50, a + b + c - 50],
                             white_Lambert, 'C12')

        point1 = np.array([0, 0, -50])
        point2 = np.array([1, 1, -50])
        point3 = np.array([33, 33, 34])
        point4 = np.array([49, 49, 0])

        S1 = scene.Surface({
            T1, T2, T3, T4, C1, C2, C3, C4, C5, C6, C7, C8, C9, C10, C11, C12
        })

        embeddedpoint1 = scene.EmbeddedPoint(point1, C1)
        embeddedpoint2 = scene.EmbeddedPoint(point2, None)
        embeddedpoint3 = scene.EmbeddedPoint(point3, T1)
        embeddedpoint4 = scene.EmbeddedPoint(point3, None)
        embeddedpoint5 = scene.EmbeddedPoint(point4, T2)

        x = None
        while x is None:
            x = S1.join(5, embeddedpoint1, 5, embeddedpoint3)
        y = S1.convert_to_bouncebeam_list('emitted', x, 'absorbed', 'B')
        self.assertEqual(len(x), 12)
        self.assertEqual(len(y), 12)
        for i in range(11):
            # print(y[i].incoming_vector, x[i].piece.name, y[i].outgoing_direction, y[i].beam_color)
            self.assertTrue((y[i].outgoing_direction == scene.normalize(
                y[i + 1].incoming_vector)).all())
        z = S1.convert_to_interaction_list('emitted', x, 'absorbed', 'B')
        # for key in z:
        # 	print(key.embeddedpoint.piece.name, key.physical_likelihood, key.forwards_sampling_likelihood, key.backwards_sampling_likelihood)
        print(S1.emitters)