def test_sum_vectors(self): m = 10 n = 3 vectors = [[j for j in range(n)] for i in range(m)] r0 = basic.sum_vectors(vectors, axis=0) r1 = basic.sum_vectors(vectors, axis=1) self.assertEqual(len(r0), n) self.assertEqual(len(r1), m)
def circle_from_points(a, b, c): """Construct a circle from three points. Parameters ---------- a : sequence of float XYZ coordinates. b : sequence of float XYZ coordinates. c : sequence of float XYZ coordinates. Returns ------- circle : tuple Center, radius, normal of the circle. References ---------- https://en.wikipedia.org/wiki/Circumscribed_circle Examples -------- >>> """ ab = subtract_vectors(b, a) cb = subtract_vectors(b, c) ba = subtract_vectors(a, b) ca = subtract_vectors(a, c) ac = subtract_vectors(c, a) bc = subtract_vectors(c, b) normal = normalize_vector(cross_vectors(ab, ac)) d = 2 * length_vector_sqrd(cross_vectors(ba, cb)) A = length_vector_sqrd(cb) * dot_vectors(ba, ca) / d B = length_vector_sqrd(ca) * dot_vectors(ab, cb) / d C = length_vector_sqrd(ba) * dot_vectors(ac, bc) / d Aa = scale_vector(a, A) Bb = scale_vector(b, B) Cc = scale_vector(c, C) center = sum_vectors([Aa, Bb, Cc]) radius = length_vector(subtract_vectors(a, center)) return center, radius, normal
def weighted_centroid_points(points, weights): """Compute the weighted centroid of a set of points. The weights can be any between minus and plus infinity. Parameters ---------- points : list A list of point coordinates. weights : list A list of weight floats. Returns ------- list The coordinates of the weighted centroid. """ vectors = [scale_vector(point, weight) for point, weight in zip(points, weights)] vector = scale_vector(sum_vectors(vectors), 1. / sum(weights)) return vector