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
10 def points_to_line((x1, y1), (x2, y2)):
11 return (y2 - y1, x1 - x2, x2 * y1 - x1 * y2)
13 def fill(l1, l2, lh, n):
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)))
26 lhc = intersection(lh, lm)
27 return (fill(l1, lm, (lh1, lhc), n / 2) +
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)))
43 (intersection(l1, lh),
44 intersection(nl, lh)), 2) +
47 (intersection(nl, lh),
48 intersection(nr, lh)), 2) +
51 (intersection(nr, lh),
52 intersection(l2, lh)), 2))
54 def expand_right(grid, middle):
55 return expand(grid[-2], grid[-1],
56 (intersection(middle, grid[-2]),
57 (intersection(middle, grid[-1]))))
59 def expand_left(grid, middle):
60 return expand(grid[1], grid[0],
61 (intersection(middle, grid[1]),
62 (intersection(middle, grid[0]))))
64 def expand(l1, l2, lh):
68 nt = intersection((l12, lh2), (l11, l21))
69 nb = intersection((l11, lh2), (l12, l22))