Changeset - 4d9660f111e4
[Not reviewed]
default
0 1 0
Laman - 6 years ago 2019-01-19 11:07:09

grid: refactored out transformation matrix construction
1 file changed with 28 insertions and 23 deletions:
0 comments (0 inline, 0 general)
src/analyzer/grid.py
Show inline comments
 
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
0 comments (0 inline, 0 general)