day2/koch.py
changeset 0 9243d75024cc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/day2/koch.py	Fri Oct 02 16:42:15 2009 +0530
@@ -0,0 +1,40 @@
+import pylab as P
+
+def split_line(pt1, pt2):
+    """Given two complex numbers p1 and p2 return a list of the
+    necessary points pairwise.
+    """
+    # The points we generate are p1, p2, p3, p4 and p5
+    p1, p5 =  pt1, pt2
+    diff = pt2 - pt1
+    segment = diff/3.0
+    p2 = p1 + segment
+    p4 = p5 - segment
+    # Now rotate a line given by 60degrees.
+    # Recall that complex multiplication does this easily.
+    # Complex numbers are defined by complex(a, b) also.
+    p3 = p2 + segment*complex(P.cos(P.pi/3), P.sin(P.pi/3))
+    return [(p1, p2), (p2, p3), (p3, p4), (p4, p5)]
+
+def koch(n):
+    start = complex(0, 0)
+    end = complex(1, 0)
+    points = [(start, end)]
+    for level in range(n):
+        new_points = []
+        for (p1, p2) in points:
+            new_points.extend(split_line(p1, p2))
+        points = new_points
+    points.insert(0, (start, points[0][0]) )
+    points.append((points[-1][1], end))
+    return points
+
+def plot_koch(n):
+    points = koch(n)
+    x = [t[0].real for t in points]
+    y = [t[0].imag for t in points]
+
+    P.plot(x, y, 'r-')
+    P.ylim(0, 1)
+    P.xlim(0, 1)
+