# HG changeset patch # User Laman # Date 2019-01-19 11:07:09 # Node ID 4d9660f111e427d06b6822b6eb80894780d1ba58 # Parent 046759436f6e5b08b1ca8cd10cbf028a89c3e063 grid: refactored out transformation matrix construction diff --git a/src/analyzer/grid.py b/src/analyzer/grid.py --- a/src/analyzer/grid.py +++ b/src/analyzer/grid.py @@ -1,5 +1,6 @@ -import numpy -from .epoint import EPoint +import numpy as np + +from .epoint import EPoint,homogenize ## Projective transformation of a point with a matrix A. @@ -8,7 +9,28 @@ from .epoint import EPoint # # @return transformed point as a numpy.array def transformPoint(point,A): - return (A*numpy.matrix(point).transpose()).getA1() + return (A*np.matrix(point).transpose()).getA1() + + +def computeRectiMatrix(a,b,c,d): + """Computes a matrix mapping a projective space to an affine space. + ABCD quadrangle gets transformed to a parallelogram. + + :param a,b,c,d: projective points""" + # ad + # bc + p1=np.cross(a,b) + p2=np.cross(c,d) + # 32 bit int can overflow. keeping it reasonably small. might want to use a cleaner solution + vanish1=homogenize(np.cross(p1, p2)) + + p3=np.cross(a,d) + p4=np.cross(b,c) + vanish2=homogenize(np.cross(p3, p4)) + + horizon=homogenize(np.cross(vanish1, vanish2)) + + return np.matrix([horizon,[0,1,0],[0,0,1]]) class Grid: @@ -26,29 +48,12 @@ class Grid: def __init__(self,corners): # ad # bc - a,b,c,d=[c.toProjective() for c in corners] - - p1=numpy.cross(a,b) - p2=numpy.cross(c,d) - vanish1=numpy.cross(p1,p2) - # !! 32 bit int can overflow. keeping it reasonably small. might want to use a cleaner solution - vanish1=EPoint.fromProjective(vanish1).toProjective() # !! EPoint fails with point in infinity + a,b,c,d=(c.toProjective() for c in corners) - p3=numpy.cross(a,d) - p4=numpy.cross(b,c) - vanish2=numpy.cross(p3,p4) - vanish2=EPoint.fromProjective(vanish2).toProjective() - - horizon=numpy.cross(vanish1,vanish2) - - horizon=EPoint.fromProjective(horizon).toProjective() - - rectiMatrix=numpy.matrix([horizon,[0,1,0],[0,0,1]]) - rectiMatrixInv=numpy.linalg.inv(rectiMatrix) - + rectiMatrix=computeRectiMatrix(a,b,c,d) + rectiMatrixInv=np.linalg.inv(rectiMatrix) affineCorners=[EPoint.fromProjective(transformPoint(x,rectiMatrix)) for x in (a,b,c,d)] - x=[affineCorners[0]-affineCorners[3],affineCorners[1]-affineCorners[2],affineCorners[0]-affineCorners[1],affineCorners[3]-affineCorners[2]] self.intersections=[] boardSize=19