diff --git a/chris_ellipse_exploration/ellipse.py b/chris_ellipse_exploration/ellipse.py index 5a2fb2f..4f8d6e9 100644 --- a/chris_ellipse_exploration/ellipse.py +++ b/chris_ellipse_exploration/ellipse.py @@ -17,6 +17,7 @@ def ellipse(rx, ry, num_points, points_to_draw=None): for i in range(points_to_draw or num_points): φi = get_angle(rx, ry, num_points, i) di = get_distance(rx, ry, num_points, i) + print(i, φi, di) left(φi) forward(di) left(-π/2) @@ -79,9 +80,10 @@ def project_onto_basis(vec, basis): is perpendicular (vec_b). """ v0, v1 = vec - b0, b1 = basis - len_a = dot(vec, basis) - vec_a = (len_a * v0, len_a * v1) + unit_basis = normalize(basis) + b0, b1 = unit_basis + len_a = dot(vec, unit_basis) + vec_a = (len_a * b0, len_a * b1) vec_b = get_vector(vec_a, vec) return vec_a, vec_b @@ -93,6 +95,13 @@ def dot(vec0, vec1): x1, y1 = vec1 return x0 * x1 + y0 * y1 +def normalize(vec): + """Scales vec to magnitude 1. + """ + x, y = vec + len_vec = mag(vec) + return x / len_vec, y / len_vec + def mag(vec): """Returns the magnitude, or length, of a vector. We can simplify the familiar formula sqrt(x*x + y*y) diff --git a/chris_ellipse_exploration/ellipse_test.py b/chris_ellipse_exploration/ellipse_test.py deleted file mode 100644 index d56d454..0000000 --- a/chris_ellipse_exploration/ellipse_test.py +++ /dev/null @@ -1,5 +0,0 @@ -from ellipse import ellipse - -ellipse(100, 200, 1024) - -input() diff --git a/chris_ellipse_exploration/tests.py b/chris_ellipse_exploration/tests.py new file mode 100644 index 0000000..fdc8a20 --- /dev/null +++ b/chris_ellipse_exploration/tests.py @@ -0,0 +1,24 @@ +# To run these tests run: python -m unittest tests + +from unittest import TestCase +from ellipse import * +from math import sqrt + +class TestEllipseFunctions(TestCase): + def test_normalize(self): + observed = normalize((0, 1)) + expected = (0, 1) + self.assertEqual(observed, expected) + + observed = normalize((2, 0)) + expected = (1, 0) + self.assertEqual(observed, expected) + + observed = normalize((1, 1)) + expected = (1/sqrt(2), 1/sqrt(2)) + self.assertEqual(observed, expected) + + def test_project_onto_basis(self): + observed = project_onto_basis((4, 3), (4, 0)) + expected = ((4, 0), (0, 3)) + self.assertEqual(observed, expected)