148430bb9b9e359fa0763f8bab3b6304241e2819
[imago.git] / new_geometry.py
1
2 def intersection(l1, l2):
3     a1, b1, c1 = points_to_line(*l1)
4     a2, b2, c2 = points_to_line(*l2)
5     delim = float(a1 * b2 - b1 * a2)
6     x = (b1 * c2 - c1 * b2) / delim
7     y = (c1 * a2 - a1 * c2) / delim
8     return x, y
9
10 def points_to_line((x1, y1), (x2, y2)):
11     return (y2 - y1, x1 - x2, x2 * y1 - x1 * y2)
12
13 def fill(l1, l2, lh, n):
14     if n == 0:
15         return []
16     l11, l12 = l1
17     l21, l22 = l2
18     lh1, lh2 = lh
19     lmt = intersection((lh1, l21), (lh2, l11))
20     lmb = intersection((lh1, l22), (lh2, l12))
21     lm = (intersection((l11, l21), (lmt, lmb)),
22           intersection((l12, l22), (lmt, lmb)))
23     if n == 1:
24         return [lm]
25     if n % 2 == 1:
26         lhc = intersection(lh, lm)
27         return (fill(l1, lm, (lh1, lhc), n / 2) +
28                 [lm] +
29                 fill(lm, l2, (lhc, lh2), n / 2))
30     elif n == 2 or n == 8:
31         nlt = intersection((lh1, l21), (l11, l22))
32         nlb = intersection((lh1, l22), (l12, l21))
33         nrt = intersection((lh2, l11), (l12, l21))
34         nrb = intersection((lh2, l12), (l11, l22))
35         nl = (intersection((l11, l21), (nlt, nlb)),
36               intersection((l12, l22), (nlt, nlb)))
37         nr = (intersection((l11, l21), (nrt, nrb)),
38               intersection((l12, l22), (nrt, nrb)))
39         if n == 2:
40             return [nl, nr]
41         elif n == 8:
42             return (fill(l1, nl, lh, 2) +
43                     [nl] +
44                     fill(nl, nr, lh, 2) +
45                     [nr] +
46                     fill(nr, l2, lh, 2))
47         
48 def expand_right(grid, middle):
49     return expand(grid[-2], grid[-1], 
50                   (intersection(middle, grid[-2]),
51                    (intersection(middle, grid[-1]))))
52
53 def expand_left(grid, middle):
54     return expand(grid[1], grid[0], 
55                   (intersection(middle, grid[1]),
56                    (intersection(middle, grid[0]))))
57
58 def expand(l1, l2, lh):
59     l11, l12 = l1
60     l21, l22 = l2
61     lh1, lh2 = lh
62     nt = intersection((l12, lh2), (l11, l21))
63     nb = intersection((l11, lh2), (l12, l22))
64     return (nt, nb)