From: Tomas Musil Date: Tue, 22 Jul 2014 21:09:25 +0000 (+0200) Subject: works without pygame, where not needed X-Git-Url: http://git.tomasm.cz/imago.git/commitdiff_plain/81e4eb0f1e3e06ab476c9707fb950c0e1225d33f works without pygame, where not needed --- diff --git a/src/gridf3.py b/src/gridf3.py index ca8decb..b554e74 100644 --- a/src/gridf3.py +++ b/src/gridf3.py @@ -4,7 +4,7 @@ from math import sqrt from intrsc import intersections_from_angl_dist import linef as linef import ransac as ransac -import manual as manual +import manual_lines as manual from geometry import l2ad # TODO comments, refactoring, move methods to appropriate modules diff --git a/src/imago.py b/src/imago.py index fd16af0..698ef2d 100755 --- a/src/imago.py +++ b/src/imago.py @@ -14,7 +14,6 @@ except ImportError, msg: sys.exit(1) import linef -import manual import intrsc import gridf3 as gridf import output @@ -94,6 +93,7 @@ def main(): pass if args.manual_mode: + import manual try: lines = manual.find_lines(image) except manual.UserQuitError: diff --git a/src/manual.py b/src/manual.py index 2eb4ac5..c00881b 100644 --- a/src/manual.py +++ b/src/manual.py @@ -5,6 +5,7 @@ from PIL import ImageDraw import pygame from geometry import l2ad, line, intersection +from manual_lines import * class UserQuitError(Exception): pass @@ -22,8 +23,6 @@ class Screen: self._screen.blit(pg_img, (0, 0)) pygame.display.flip() -def dst((x1, y1), (x2, y2)): - return (x1 - x2) ** 2 + (y1 - y2) ** 2 def display_instr(): @@ -71,6 +70,9 @@ def find_lines(im_orig): line_width = 1 lines_r = [] + def dst((x1, y1), (x2, y2)): + return (x1 - x2) ** 2 + (y1 - y2) ** 2 + while True: for event in pygame.event.get(): if event.type == pygame.QUIT or event.type == pygame.KEYDOWN: @@ -112,62 +114,4 @@ def find_lines(im_orig): screen.display_picture(im) clock.tick(15) -def lines(corners): - # TODO Error on triangle - corners.sort() # TODO does this help? - # TODO refactor this vvv - 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(min(a, 1)), 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): - # TODO what is this? - if n == 0: - x = half_line(corners) - return (_lines([corners[0], x[0], x[1], corners[3]], 1) + [x] + - _lines([x[0], corners[1], corners[2], x[1]], 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])) - 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)) - if n == 2: - return [l, l2] - - -def half_line(corners): - # TODO what is this? - c = center(corners) - d = intersection(line(corners[0], corners[3]), line(corners[1], corners[2])) - if d: - l = line(c, d) - else: - l = line(c, (c[0] + corners[0][0] - corners[3][0], - c[1] + corners[0][1] - corners[3][1])) - p1 = intersection(l, line(corners[0], corners[1])) - p2 = intersection(l, line(corners[2], corners[3])) - return (p1, p2) - -def center(corners): - """Given a list of four corner points, return the center of the square.""" - return intersection(line(corners[0], corners[2]), - line(corners[1], corners[3])) + diff --git a/src/manual_lines.py b/src/manual_lines.py new file mode 100644 index 0000000..cb06bfe --- /dev/null +++ b/src/manual_lines.py @@ -0,0 +1,64 @@ +"""Computing the grid""" + +from math import sqrt, acos, copysign +from geometry import l2ad, line, intersection + +def lines(corners): + # TODO Error on triangle + corners.sort() # TODO does this help? + # TODO refactor this vvv + 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(min(a, 1)), 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): + # TODO what is this? + if n == 0: + x = half_line(corners) + return (_lines([corners[0], x[0], x[1], corners[3]], 1) + [x] + + _lines([x[0], corners[1], corners[2], x[1]], 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])) + 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)) + if n == 2: + return [l, l2] + + +def half_line(corners): + # TODO what is this? + c = center(corners) + d = intersection(line(corners[0], corners[3]), line(corners[1], corners[2])) + if d: + l = line(c, d) + else: + l = line(c, (c[0] + corners[0][0] - corners[3][0], + c[1] + corners[0][1] - corners[3][1])) + p1 = intersection(l, line(corners[0], corners[1])) + p2 = intersection(l, line(corners[2], corners[3])) + return (p1, p2) + +def center(corners): + """Given a list of four corner points, return the center of the square.""" + return intersection(line(corners[0], corners[2]), + line(corners[1], corners[3]))