def test_from_npoints_plane(self): best_fits = ['least_square_distance', 'maximum_distance'] delta = 0.0001 for best_fit in best_fits: plane = Plane.from_npoints([self.p1, self.p2, self.p3], best_fit=best_fit) self.assertTrue(self.plane.is_same_plane_as(plane)) points = [np.array([5.1, 0.3, -2.3]), np.array([-2.0, 4.3, -6.3]), np.array([3.1, 2.3, -21.3]), np.array([-2, -0.5, 0.05]), np.array([11, 12, -13]), np.array([10, 8.3, -6.32])] plane = Plane.from_npoints(points, best_fit=best_fit) fit_error_plane = plane.fit_error(points, fit=best_fit) coeffs = [[1.0+delta, 1, 1, 1], [1, 1.0+delta, 1, 1], [1, 1, 1.0+delta, 1], [1, 1, 1, 1.0+delta], [1.0-delta, 1.0+delta, 1.0-delta, 1.0+delta]] for coeff in coeffs: plane_changed = Plane.from_coefficients(coeff[0]*plane.a, coeff[1]*plane.b, coeff[2]*plane.c, coeff[3]*plane.d) fit_error = plane_changed.fit_error(points, fit=best_fit) self.assertGreater(fit_error, fit_error_plane) coeff = [-2.1, -2.1, -2.1, -2.1] plane_not_changed = Plane.from_coefficients(coeff[0]*plane.a, coeff[1]*plane.b, coeff[2]*plane.c, coeff[3]*plane.d) fit_error = plane_not_changed.fit_error(points, fit=best_fit) self.assertAlmostEqual(fit_error, fit_error_plane)
def test_from_npoints_plane(self): best_fits = ['least_square_distance', 'maximum_distance'] delta = 0.0001 for best_fit in best_fits: plane = Plane.from_npoints([self.p1, self.p2, self.p3], best_fit=best_fit) self.assertTrue(self.plane.is_same_plane_as(plane)) points = [ np.array([5.1, 0.3, -2.3]), np.array([-2.0, 4.3, -6.3]), np.array([3.1, 2.3, -21.3]), np.array([-2, -0.5, 0.05]), np.array([11, 12, -13]), np.array([10, 8.3, -6.32]) ] plane = Plane.from_npoints(points, best_fit=best_fit) fit_error_plane = plane.fit_error(points, fit=best_fit) coeffs = [[1.0 + delta, 1, 1, 1], [1, 1.0 + delta, 1, 1], [1, 1, 1.0 + delta, 1], [1, 1, 1, 1.0 + delta], [1.0 - delta, 1.0 + delta, 1.0 - delta, 1.0 + delta]] for coeff in coeffs: plane_changed = Plane.from_coefficients( coeff[0] * plane.a, coeff[1] * plane.b, coeff[2] * plane.c, coeff[3] * plane.d) fit_error = plane_changed.fit_error(points, fit=best_fit) self.assertGreater(fit_error, fit_error_plane) coeff = [-2.1, -2.1, -2.1, -2.1] plane_not_changed = Plane.from_coefficients( coeff[0] * plane.a, coeff[1] * plane.b, coeff[2] * plane.c, coeff[3] * plane.d) fit_error = plane_not_changed.fit_error(points, fit=best_fit) self.assertAlmostEqual(fit_error, fit_error_plane)
def test_distances(self): # Test with the common test plane point_1 = np.array([0.0, 0.0, 0.0], np.float) point_2 = np.array([0.0, 0.0, 0.75], np.float) point_3 = np.array([-0.75, 0.0, 0.0], np.float) point_4 = np.array([1.0, 0.0, 0.0], np.float) point_5 = np.array([0.0, -1.5, 0.0], np.float) point_6 = np.array([10.0, 2.0, -20.0], np.float) point_7 = np.array([10.0, 10.0, 10.0], np.float) point_8 = np.array([100.0, 0.0, 0.0], np.float) plist = [point_1, point_2, point_4, point_6, point_7, point_8] distances, indices_sorted = self.plane.distances_indices_sorted(plist) self.assertArrayAlmostEqual(distances, [0.5, 0.0, 1.16666666666666, 21.1666666666666, 3.8333333333333, 67.1666666666666]) self.assertArrayEqual(indices_sorted, [1, 0, 2, 4, 3, 5]) # Plane 2y+1=0 (perpendicular to y) plane = Plane.from_coefficients(0, 2, 0, 1) plist = [point_1, point_5, point_6, point_7] distances, indices_sorted = plane.distances_indices_sorted(plist) self.assertArrayAlmostEqual(distances, [0.5, -1.0, 2.5, 10.5]) self.assertArrayEqual(indices_sorted, [0, 1, 2, 3]) plist = [point_1, point_5, point_6, point_7] distances, indices_sorted = plane.distances_indices_sorted(plist) self.assertArrayAlmostEqual(distances, [0.5, -1.0, 2.5, 10.5]) self.assertArrayEqual(indices_sorted, [0, 1, 2, 3]) distances, indices_sorted = plane.distances_indices_sorted(plist, sign=True) self.assertArrayAlmostEqual(distances, [0.5, -1.0, 2.5, 10.5]) self.assertArrayEqual(indices_sorted, [(0, 1), (1, -1), (2, 1), (3, 1)]) plist = [point_5, point_1, point_6, point_7] distances, indices_sorted, groups = plane.distances_indices_groups(plist) self.assertArrayAlmostEqual(distances, [-1.0, 0.5, 2.5, 10.5]) self.assertArrayEqual(indices_sorted, [1, 0, 2, 3]) self.assertArrayEqual(groups, [[1, 0], [2], [3]]) plist = [point_1, point_2, point_3, point_4, point_5, point_6, point_7, point_8] distances, indices_sorted = plane.distances_indices_sorted(plist) self.assertArrayAlmostEqual(distances, [0.5, 0.5, 0.5, 0.5, -1.0, 2.5, 10.5, 0.5]) self.assertEqual(set(indices_sorted[:5]), {0, 1, 2, 3, 7}) # Plane z=0 (plane xy) plane = Plane.from_coefficients(0, 0, 1, 0) zzs = [0.1, -0.2, 0.7, -2.1, -1.85, 0.0, -0.71, -0.82, -6.5, 1.8] plist = [] for zz in zzs: plist.append([random.uniform(-20.0, 20.0), random.uniform(-20.0, 20.0), zz]) distances, indices_sorted, groups = plane.distances_indices_groups(points=plist, delta=0.25) self.assertArrayEqual(indices_sorted, [5, 0, 1, 2, 6, 7, 9, 4, 3, 8]) self.assertArrayEqual(groups, [[5, 0, 1], [2, 6, 7], [9, 4, 3], [8]]) self.assertArrayAlmostEqual(distances, zzs) distances, indices_sorted, groups = plane.distances_indices_groups(points=plist, delta_factor=0.1) self.assertArrayEqual(indices_sorted, [5, 0, 1, 2, 6, 7, 9, 4, 3, 8]) self.assertArrayEqual(groups, [[5, 0, 1, 2, 6, 7], [9, 4, 3], [8]]) self.assertArrayAlmostEqual(distances, zzs) distances, indices_sorted, groups = plane.distances_indices_groups(points=plist, delta_factor=0.1, sign=True) self.assertArrayEqual(indices_sorted, [(5, 0), (0, 1), (1, -1), (2, 1), (6, -1), (7, -1), (9, 1), (4, -1), (3, -1), (8, -1)]) self.assertArrayEqual(groups, [[(5, 0), (0, 1), (1, -1), (2, 1), (6, -1), (7, -1)], [(9, 1), (4, -1), (3, -1)], [(8, -1)]]) self.assertArrayAlmostEqual(distances, zzs)
def test_plane_is_in_list_of_planes(self): plane_test_1 = Plane.from_coefficients(-8.1, 2, -4, 3) plane_test_2 = Plane.from_coefficients(0, -2, 4, 0) plane_test_3 = Plane.from_coefficients(-12, -6, 12, -9) plane_test_4 = Plane.from_coefficients(3, 0, 0, 4) plane_list = [plane_test_1, plane_test_2, plane_test_3, plane_test_4] self.assertTrue(self.plane.is_in_list(plane_list)) plane_list = [plane_test_1, plane_test_2, plane_test_4] self.assertFalse(self.plane.is_in_list(plane_list))
def test_plane_comparison(self): plane_test_1 = Plane.from_coefficients(4, 2, -4, 3) self.assertTrue(self.plane.is_same_plane_as(plane_test_1)) plane_test_2 = Plane.from_coefficients(-4, -2, 4, -3) self.assertTrue(self.plane.is_same_plane_as(plane_test_2)) plane_test_3 = Plane.from_coefficients(-12, -6, 12, -9) self.assertTrue(self.plane.is_same_plane_as(plane_test_3)) plane_test_4 = Plane.from_coefficients(3, 0, 2, 4) self.assertFalse(self.plane.is_same_plane_as(plane_test_4))
def test_plane_2_coefficients(self): plane_1 = Plane.from_coefficients(-21, 0, 0, 3) self.assertTrue(plane_1.is_in_plane(plane_1.p1, 0.000001)) self.assertTrue(plane_1.is_in_plane(plane_1.p2, 0.000001)) self.assertTrue(plane_1.is_in_plane(plane_1.p3, 0.000001)) plane_2 = Plane.from_coefficients(0, 4, 0, -4) self.assertTrue(plane_2.is_in_plane(plane_2.p1, 0.000001)) self.assertTrue(plane_2.is_in_plane(plane_2.p2, 0.000001)) self.assertTrue(plane_2.is_in_plane(plane_2.p3, 0.000001)) plane_3 = Plane.from_coefficients(0, 0, 3, 1) self.assertTrue(plane_3.is_in_plane(plane_3.p1, 0.000001)) self.assertTrue(plane_3.is_in_plane(plane_3.p2, 0.000001)) self.assertTrue(plane_3.is_in_plane(plane_3.p3, 0.000001))
def test_plane_3_coefficients(self): plane_1 = Plane.from_coefficients(0, 2, -1, 3) self.assertTrue(plane_1.is_in_plane(plane_1.p1, 0.000001)) self.assertTrue(plane_1.is_in_plane(plane_1.p2, 0.000001)) self.assertTrue(plane_1.is_in_plane(plane_1.p3, 0.000001)) plane_2 = Plane.from_coefficients(12, 0, 2, -4) self.assertTrue(plane_2.is_in_plane(plane_2.p1, 0.000001)) self.assertTrue(plane_2.is_in_plane(plane_2.p2, 0.000001)) self.assertTrue(plane_2.is_in_plane(plane_2.p3, 0.000001)) plane_3 = Plane.from_coefficients(-8, 8, 0, 0) self.assertTrue(plane_3.is_in_plane(plane_3.p1, 0.000001)) self.assertTrue(plane_3.is_in_plane(plane_3.p2, 0.000001)) self.assertTrue(plane_3.is_in_plane(plane_3.p3, 0.000001))
def test_indices_separate(self): # Test with the common test plane point_1 = np.array([0.0, 0.0, 0.0], np.float_) point_2 = np.array([0.0, 0.0, 0.75], np.float_) point_3 = np.array([-0.75, 0.0, 0.0], np.float_) point_4 = np.array([1.0, 0.0, 0.0], np.float_) point_5 = np.array([0.0, -1.5, 0.0], np.float_) point_6 = np.array([10.0, 2.0, -20.0], np.float_) point_7 = np.array([10.0, 10.0, 10.0], np.float_) point_8 = np.array([100.0, 0.0, 0.0], np.float_) plist = [ point_1, point_2, point_3, point_4, point_5, point_6, point_7, point_8 ] sep = self.plane.indices_separate(plist, 0.000001) self.assertEqual(len(sep[0]), 0) self.assertEqual(len(sep[1]), 3) self.assertEqual(len(sep[2]), 5) self.assertTrue(np.allclose(sep[1], [1, 2, 4])) self.assertTrue(np.allclose(sep[2], [0, 3, 5, 6, 7])) sep = self.plane.indices_separate(plist, 10) self.assertEqual(len(sep[0]), 0) self.assertEqual(len(sep[1]), 6) self.assertEqual(len(sep[2]), 2) self.assertTrue(np.allclose(sep[1], [0, 1, 2, 3, 4, 6])) self.assertTrue(np.allclose(sep[2], [5, 7])) sep = self.plane.indices_separate(plist, 100000) self.assertEqual(len(sep[0]), 0) self.assertEqual(len(sep[1]), 8) self.assertEqual(len(sep[2]), 0) # Test with 2 coeff facets (Normal vector = [1, 0, 0] or [0, 1, 0] or [0, 0, 1]) # Plane x-2=0 (perpendicular to x) plane = Plane.from_coefficients(-4, 0, 0, 8) sep = plane.indices_separate(plist, 0.00001) self.assertEqual(sep[0], [0, 1, 2, 3, 4]) self.assertEqual(sep[1], []) self.assertEqual(sep[2], [5, 6, 7]) sep = plane.indices_separate(plist, 1.0) self.assertEqual(sep[0], [0, 1, 2, 4]) self.assertEqual(sep[1], [3]) self.assertEqual(sep[2], [5, 6, 7]) # Plane 2y+1=0 (perpendicular to y) plane = Plane.from_coefficients(0, 2, 0, 1) sep = plane.indices_separate(plist, 0.00001) self.assertEqual(sep[0], [4]) self.assertEqual(sep[1], []) self.assertEqual(sep[2], [0, 1, 2, 3, 5, 6, 7]) sep = plane.indices_separate(plist, 1.0) self.assertEqual(sep[0], []) self.assertEqual(sep[1], [0, 1, 2, 3, 4, 7]) self.assertEqual(sep[2], [5, 6]) # Plane 4z-3=0 (perpendicular to z) plane = Plane.from_coefficients(0, 0, -4, 3) sep = plane.indices_separate(plist, 0.00001) self.assertEqual(sep[0], [0, 2, 3, 4, 5, 7]) self.assertEqual(sep[1], [1]) self.assertEqual(sep[2], [6]) sep = plane.indices_separate(plist, 0.75) self.assertEqual(sep[0], [5]) self.assertEqual(sep[1], [0, 1, 2, 3, 4, 7]) self.assertEqual(sep[2], [6]) # Test with 3 coeff facets (Normal vector = [0, a, b] or [a, 0, b] or [a, b, 0]) # Plane 2y-z+4=0 plane = Plane.from_coefficients(0, 2, -1, 0) sep = plane.indices_separate(plist, 0.00001) self.assertEqual(sep[0], [1, 4]) self.assertEqual(sep[1], [0, 2, 3, 7]) self.assertEqual(sep[2], [5, 6]) sep = plane.indices_separate(plist, 0.75) self.assertEqual(sep[0], [4]) self.assertEqual(sep[1], [0, 1, 2, 3, 7]) self.assertEqual(sep[2], [5, 6]) # Plane 2y-z+4=0 plane = Plane.from_coefficients(4, 0, -2, -20) sep = plane.indices_separate(plist, 0.00001) self.assertEqual(sep[0], [0, 1, 2, 3, 4]) self.assertEqual(sep[1], [6]) self.assertEqual(sep[2], [5, 7]) # Plane 2y-z+4=0 plane = Plane.from_coefficients(-2, 9, 0, 2) sep = plane.indices_separate(plist, 0.00001) self.assertEqual(sep[0], [0, 1, 2, 6]) self.assertEqual(sep[1], [3, 5]) self.assertEqual(sep[2], [4, 7])
def test_indices_separate(self): #Test with the common test plane point_1 = np.array([0.0, 0.0, 0.0], np.float) point_2 = np.array([0.0, 0.0, 0.75], np.float) point_3 = np.array([-0.75, 0.0, 0.0], np.float) point_4 = np.array([1.0, 0.0, 0.0], np.float) point_5 = np.array([0.0, -1.5, 0.0], np.float) point_6 = np.array([10.0, 2.0, -20.0], np.float) point_7 = np.array([10.0, 10.0, 10.0], np.float) point_8 = np.array([100.0, 0.0, 0.0], np.float) plist = [point_1, point_2, point_3, point_4, point_5, point_6, point_7, point_8] sep = self.plane.indices_separate(plist, 0.000001) self.assertEqual(len(sep[0]), 0) self.assertEqual(len(sep[1]), 3) self.assertEqual(len(sep[2]), 5) self.assertTrue(np.allclose(sep[1], [1, 2, 4])) self.assertTrue(np.allclose(sep[2], [0, 3, 5, 6, 7])) sep = self.plane.indices_separate(plist, 10) self.assertEqual(len(sep[0]), 0) self.assertEqual(len(sep[1]), 6) self.assertEqual(len(sep[2]), 2) self.assertTrue(np.allclose(sep[1], [0, 1, 2, 3, 4, 6])) self.assertTrue(np.allclose(sep[2], [5, 7])) sep = self.plane.indices_separate(plist, 100000) self.assertEqual(len(sep[0]), 0) self.assertEqual(len(sep[1]), 8) self.assertEqual(len(sep[2]), 0) #Test with 2 coeff facets (Normal vector = [1, 0, 0] or [0, 1, 0] or [0, 0, 1]) #Plane x-2=0 (perpendicular to x) plane = Plane.from_coefficients(-4, 0, 0, 8) sep = plane.indices_separate(plist, 0.00001) self.assertEqual(sep[0], [0, 1, 2, 3, 4]) self.assertEqual(sep[1], []) self.assertEqual(sep[2], [5, 6, 7]) sep = plane.indices_separate(plist, 1.0) self.assertEqual(sep[0], [0, 1, 2, 4]) self.assertEqual(sep[1], [3]) self.assertEqual(sep[2], [5, 6, 7]) #Plane 2y+1=0 (perpendicular to y) plane = Plane.from_coefficients(0, 2, 0, 1) sep = plane.indices_separate(plist, 0.00001) self.assertEqual(sep[0], [4]) self.assertEqual(sep[1], []) self.assertEqual(sep[2], [0, 1, 2, 3, 5, 6, 7]) sep = plane.indices_separate(plist, 1.0) self.assertEqual(sep[0], []) self.assertEqual(sep[1], [0, 1, 2, 3, 4, 7]) self.assertEqual(sep[2], [5, 6]) #Plane 4z-3=0 (perpendicular to z) plane = Plane.from_coefficients(0, 0, -4, 3) sep = plane.indices_separate(plist, 0.00001) self.assertEqual(sep[0], [0, 2, 3, 4, 5, 7]) self.assertEqual(sep[1], [1]) self.assertEqual(sep[2], [6]) sep = plane.indices_separate(plist, 0.75) self.assertEqual(sep[0], [5]) self.assertEqual(sep[1], [0, 1, 2, 3, 4, 7]) self.assertEqual(sep[2], [6]) #Test with 3 coeff facets (Normal vector = [0, a, b] or [a, 0, b] or [a, b, 0]) #Plane 2y-z+4=0 plane = Plane.from_coefficients(0, 2, -1, 0) sep = plane.indices_separate(plist, 0.00001) self.assertEqual(sep[0], [1, 4]) self.assertEqual(sep[1], [0, 2, 3, 7]) self.assertEqual(sep[2], [5, 6]) sep = plane.indices_separate(plist, 0.75) self.assertEqual(sep[0], [4]) self.assertEqual(sep[1], [0, 1, 2, 3, 7]) self.assertEqual(sep[2], [5, 6]) #Plane 2y-z+4=0 plane = Plane.from_coefficients(4, 0, -2, -20) sep = plane.indices_separate(plist, 0.00001) self.assertEqual(sep[0], [0, 1, 2, 3, 4]) self.assertEqual(sep[1], [6]) self.assertEqual(sep[2], [5, 7]) #Plane 2y-z+4=0 plane = Plane.from_coefficients(-2, 9, 0, 2) sep = plane.indices_separate(plist, 0.00001) self.assertEqual(sep[0], [0, 1, 2, 6]) self.assertEqual(sep[1], [3, 5]) self.assertEqual(sep[2], [4, 7])