X-Git-Url: http://git.tomasm.cz/imago.git/blobdiff_plain/9cacba9db688f4c2164a0ae5f388a9f5a68175ad..db4fb6da5dc88a3944352cff38cb92f68bead88c:/manual.py diff --git a/manual.py b/manual.py index c7f8e2b..e60a848 100644 --- a/manual.py +++ b/manual.py @@ -2,7 +2,7 @@ import pygame import Image, ImageDraw -from math import atan, sin, cos, pi +from math import atan, sin, cos, pi, sqrt, acos, copysign class UserQuitError(Exception): pass @@ -11,7 +11,7 @@ class Screen: def __init__(self, res): pygame.init() pygame.display.set_mode(res) - pygame.display.set_caption("Go image capture") + pygame.display.set_caption("Imago manual mode") self._screen = pygame.display.get_surface() def display_picture(self, im): @@ -53,52 +53,59 @@ def find_lines(im_orig): corners.append(pygame.mouse.get_pos()) draw.point(corners[:-1], fill=color) if len(corners) == 4: - draw.line((corners[0], corners[1]), fill=color, - width=line_width) - draw.line((corners[1], corners[2]), fill=color, - width=line_width) - draw.line((corners[2], corners[3]), fill=color, - width=line_width) - draw.line((corners[3], corners[0]), fill=color, - width=line_width) - l_vert = lines(corners, 0) + l_vert, l_hor = lines(corners) for l in l_vert: draw.line(l, fill=color, width=line_width) - l_hor = lines(corners[1:4] + [corners[0]], 0) for l in l_hor: draw.line(l, fill=color, width=line_width) - l_vert += [(corners[0], corners[3]), - (corners[1], corners[2])] - l_hor += [(corners[0], corners[1]), - (corners[2], corners[3])] + #TODO sort by distance l_vert.sort() l_hor.sort() for i in [3, 9, 15]: for j in [3, 9, 15]: hoshi(intersection(line(l_vert[i][0], l_vert[i][1]), line(l_hor[j][0], l_hor[j][1]))) - lines_r = [[l2ad(l[0], l[1], im.size) for l in l_vert], - [l2ad(l[0], l[1], im.size) for l in l_hor]] + lines_r = [[l2ad(l, im.size) for l in l_vert], + [l2ad(l, im.size) for l in l_hor]] screen.display_picture(im) clock.tick(15) -def lines(corners, n): +def lines(corners): + #TODO Error on triangle + cor_d = [(corners[0], (c[0] - corners[0][0], c[1] - corners[0][1]), c) for c in + corners[1:]] + cor_d = [(float(a[0] * b[0] + a[1] * b[1]) / (sqrt(a[0] ** 2 + a[1] ** 2) * + sqrt(b[0] **2 + b[1] ** 2)), a[0] * b[1] - b[0] * a[1], c) for a, b, c in cor_d] + cor_d = sorted([(copysign(acos(a), b), c) for a, b, c in cor_d]) + corners = [corners[0]] + [c for _, c in cor_d] + return (_lines(corners, 0) + [(corners[0], corners[3]), + (corners[1], corners[2])], + _lines(corners[1:4] + [corners[0]], 0) + + [(corners[0], corners[1]), (corners[2], corners[3])]) + +def _lines(corners, n): if n == 0: x = half_line(corners) - return (lines([corners[0], x[0], x[1], corners[3]], n + 1) + [x] + - lines([x[0], corners[1], corners[2], x[1]], n + 1)) + return (_lines([corners[0], x[0], x[1], corners[3]], n + 1) + [x] + + _lines([x[0], corners[1], corners[2], x[1]], n + 1)) else: x = half_line(corners) c = intersection(line(x[0], corners[2]), line(corners[1], corners[3])) d = intersection(line(corners[0], corners[3]), line(corners[1], corners[2])) - l = (intersection(line(corners[0], corners[1]), line(c,d)), - intersection(line(corners[2], corners[3]), line(c,d))) + if d: + l = (intersection(line(corners[0], corners[1]), line(c,d)), + intersection(line(corners[2], corners[3]), line(c,d))) + else: + lx = line(c, (c[0] + corners[0][0] - corners[3][0], + c[1] + corners[0][1] - corners[3][1])) + l = (intersection(line(corners[0], corners[1]), lx), + intersection(line(corners[2], corners[3]), lx)) l2 = half_line([corners[0], l[0], l[1], corners[3]]) if n == 1: - return ([l, l2] + lines([l[0], l2[0], l2[1], l[1]], 2) - + lines([corners[0], l2[0], l2[1], corners[3]], 2) - + lines([l[0], corners[1], corners[2], l[1]], 2)) + return ([l, l2] + _lines([l[0], l2[0], l2[1], l[1]], 2) + + _lines([corners[0], l2[0], l2[1], corners[3]], 2) + + _lines([l[0], corners[1], corners[2], l[1]], 2)) if n == 2: return [l, l2] @@ -132,7 +139,7 @@ def intersection(p, q): return (int(round(float(q[1] * p[2] - p[1] * q[2]) / det)), int(round(float(p[0] * q[2] - q[0] * p[2]) / det))) -def l2ad(a, b, size): +def l2ad((a, b), size): if (a[0] - b[0]) == 0: angle = pi / 2 else: