Пример #1
0
    def test_L_intersection(self):
        p_1 = np.zeros(3)
        p_2 = np.random.rand(3)
        p_3 = np.random.rand(3)

        p_i = cg.segments_intersect_3d(p_1, p_2, p_2, p_3)
        self.assertTrue(np.allclose(p_i, p_2.reshape((-1, 1))))
Пример #2
0
    def test_equal_lines_segments_not_overlapping(self):
        p_1 = np.ones(3)
        p_2 = 0 * p_1
        p_3 = 2 * p_1
        p_4 = 3 * p_1

        p_int = cg.segments_intersect_3d(p_1, p_2, p_3, p_4)
        self.assertTrue(p_int is None)
Пример #3
0
    def test_lines_cross_segments_not(self):
        p_1 = np.array([-1, 0, -1])
        p_2 = np.array([0, 0, 0])
        p_3 = np.array([1, -1, 1])
        p_4 = np.array([1, 1, 1])

        p_i = cg.segments_intersect_3d(p_1, p_2, p_3, p_4)
        self.assertTrue(p_i is None)
Пример #4
0
    def test_parallel_lines(self):
        p_1 = np.zeros(3)
        p_2 = np.array([1, 0, 0])
        p_3 = np.array([0, 1, 0])
        p_4 = np.array([1, 1, 0])

        p_i = cg.segments_intersect_3d(p_1, p_2, p_3, p_4)
        self.assertTrue(p_i is None)
Пример #5
0
    def test_intersection_origin(self):
        # 3D lines cross in the origin
        p_1 = np.array([0, -1, -1])
        p_2 = np.array([0, 1, 1])
        p_3 = np.array([-1, 0, 1])
        p_4 = np.array([1, 0, -1])

        p_i = cg.segments_intersect_3d(p_1, p_2, p_3, p_4)
        self.assertTrue(np.allclose(p_i, np.zeros(3)))
Пример #6
0
    def test_argument_order_arbitrary(self):
        # Order of input arguments should be arbitrary
        p_1 = np.array([0, -1, -1])
        p_2 = np.array([0, 1, 1])
        p_3 = np.array([-1, 0, 1])
        p_4 = np.array([1, 0, -1])

        p_known = np.zeros(3)

        p_i_1 = cg.segments_intersect_3d(p_1, p_2, p_3, p_4)
        p_i_2 = cg.segments_intersect_3d(p_2, p_1, p_3, p_4)
        p_i_3 = cg.segments_intersect_3d(p_1, p_2, p_4, p_3)
        p_i_4 = cg.segments_intersect_3d(p_2, p_1, p_4, p_3)

        self.assertTrue(np.allclose(p_i_1, p_known))
        self.assertTrue(np.allclose(p_i_2, p_known))
        self.assertTrue(np.allclose(p_i_3, p_known))
        self.assertTrue(np.allclose(p_i_4, p_known))
Пример #7
0
    def test_constant_y_axis(self):
        p_1 = np.array([1, 0, -1])
        p_2 = np.array([1, 0, 1])
        p_3 = np.array([1.5, 0, 0])
        p_4 = np.array([0, 0, 1.5])

        p_int = cg.segments_intersect_3d(p_1, p_2, p_3, p_4)
        p_known = np.array([1, 0, 0.5]).reshape((-1, 1))
        self.assertTrue(np.min(np.sum(np.abs(p_int - p_known), axis=0)) < 1e-8)
Пример #8
0
    def test_both_aligned_with_axis(self):
        # Both lines are aligned an axis,
        p_1 = np.array([-1, -1, 0])
        p_2 = np.array([-1, 1, 0])
        p_3 = np.array([-1, 0, -1])
        p_4 = np.array([-1, 0, 1])

        p_int = cg.segments_intersect_3d(p_1, p_2, p_3, p_4)
        p_known = np.array([-1, 0, 0]).reshape((-1, 1))
        self.assertTrue(np.allclose(p_int, p_known))
Пример #9
0
    def test_pass_in_z_coord(self):
        # The (x,y) coordinates gives intersection in origin, but z coordinates
        # do not match
        p_1 = np.array([-1, -1, -1])
        p_2 = np.array([1, 1, -1])
        p_3 = np.array([1, -1, 1])
        p_4 = np.array([-1, 1, 1])

        p_i = cg.segments_intersect_3d(p_1, p_2, p_3, p_4)
        self.assertTrue(p_i is None)
Пример #10
0
    def test_segments_aligned_with_axis(self):
        p_1 = np.array([0, 1, 1])
        p_2 = 3 * p_1
        p_3 = 0 * p_1
        p_4 = 2 * p_1

        p_int = cg.segments_intersect_3d(p_1, p_2, p_3, p_4)
        p_known_1 = p_1.reshape((-1, 1))
        p_known_2 = p_4.reshape((-1, 1))
        self.assertTrue(np.min(np.sum(np.abs(p_int - p_known_1), axis=0)) < 1e-8)
        self.assertTrue(np.min(np.sum(np.abs(p_int - p_known_2), axis=0)) < 1e-8)
Пример #11
0
    def test_random_incline(self):
        p_1 = np.random.rand(3)
        p_2 = 3 * p_1
        p_3 = 0 * p_1
        p_4 = 2 * p_1

        p_int = cg.segments_intersect_3d(p_1, p_2, p_3, p_4)
        p_known_1 = p_1.reshape((-1, 1))
        p_known_2 = p_4.reshape((-1, 1))
        self.assertTrue(np.min(np.sum(np.abs(p_int - p_known_1), axis=0)) < 1e-8)
        self.assertTrue(np.min(np.sum(np.abs(p_int - p_known_2), axis=0)) < 1e-8)
Пример #12
0
    def test_segments_partly_overlap(self):
        p_1 = np.ones(3)
        p_2 = 3 * p_1
        p_3 = 0 * p_1
        p_4 = 2 * p_1

        p_int = cg.segments_intersect_3d(p_1, p_2, p_3, p_4)
        p_known_1 = p_1.reshape((-1, 1))
        p_known_2 = p_4.reshape((-1, 1))
        self.assertTrue(np.min(np.sum(np.abs(p_int - p_known_1), axis=0)) < 1e-8)
        self.assertTrue(np.min(np.sum(np.abs(p_int - p_known_2), axis=0)) < 1e-8)
Пример #13
0
    def test_segment_fully_overlapped(self):
        # One line is fully covered by another
        p_1 = np.ones(3)
        p_2 = 2 * p_1
        p_3 = 0 * p_1
        p_4 = 3 * p_1

        p_int = cg.segments_intersect_3d(p_1, p_2, p_3, p_4)
        p_known_1 = p_1.reshape((-1, 1))
        p_known_2 = p_2.reshape((-1, 1))
        self.assertTrue(np.min(np.sum(np.abs(p_int - p_known_1), axis=0)) < 1e-8)
        self.assertTrue(np.min(np.sum(np.abs(p_int - p_known_2), axis=0)) < 1e-8)
Пример #14
0
    def test_segments_overlap_input_order(self):
        # Test the order of inputs
        p_1 = np.ones(3)
        p_2 = 2 * p_1
        p_3 = 0 * p_1
        p_4 = 3 * p_1

        p_int_1 = cg.segments_intersect_3d(p_1, p_2, p_3, p_4)
        p_int_2 = cg.segments_intersect_3d(p_2, p_1, p_3, p_4)
        p_int_3 = cg.segments_intersect_3d(p_1, p_2, p_4, p_3)
        p_int_4 = cg.segments_intersect_3d(p_2, p_1, p_4, p_3)

        p_known_1 = p_1.reshape((-1, 1))
        p_known_2 = p_2.reshape((-1, 1))

        self.assertTrue(np.min(np.sum(np.abs(p_int_1 - p_known_1), axis=0)) < 1e-8)
        self.assertTrue(np.min(np.sum(np.abs(p_int_1 - p_known_2), axis=0)) < 1e-8)
        self.assertTrue(np.min(np.sum(np.abs(p_int_2 - p_known_1), axis=0)) < 1e-8)
        self.assertTrue(np.min(np.sum(np.abs(p_int_2 - p_known_2), axis=0)) < 1e-8)
        self.assertTrue(np.min(np.sum(np.abs(p_int_3 - p_known_1), axis=0)) < 1e-8)
        self.assertTrue(np.min(np.sum(np.abs(p_int_3 - p_known_2), axis=0)) < 1e-8)
        self.assertTrue(np.min(np.sum(np.abs(p_int_4 - p_known_1), axis=0)) < 1e-8)
        self.assertTrue(np.min(np.sum(np.abs(p_int_4 - p_known_2), axis=0)) < 1e-8)