import numpy ## Multiplicates the vector as to set the first nonzero coordinate to 1. def canonize(v): if v.item(0)!=0: factor=v.item(0) elif v.item(1)!=0: factor=v.item(1) elif v.item(2)!=0: factor=v.item(2) else: factor=1 return v/factor return [x/factor for x in v] def transformPoint(point,A): # print('#68',numpy.asarray(([1]+point)*A)) x=canonize((A*numpy.matrix([1]+point).transpose()).getA1()) return x[1:] class Grid: def __init__(self,corners): # ab # cd a,b,c,d=corners p1=numpy.cross(a,b) p2=numpy.cross(c,d) vanish1=numpy.cross(p1,p2) print('#16',p1,p2,vanish1) p3=numpy.cross(a,c) p4=numpy.cross(b,d) vanish2=numpy.cross(p3,p4) print('#32',p3,p4,vanish2) horizon=canonize(numpy.cross(vanish1,vanish2)) # horizon.x+=10 # horizon[1]+=10 print('#48',horizon) rectiMatrix=numpy.matrix([horizon,[0,1,0],[0,0,1]]) rectiMatrixInv=numpy.linalg.inv(rectiMatrix) print('#64',rectiMatrixInv) print('#72',transformPoint([0,0],rectiMatrixInv)) self.intersections=[[[c,r] for c in range(3)] for r in range(3)] self.intersections=[[transformPoint(point,rectiMatrixInv) for point in line] for line in self.intersections] # b1=canonize(numpy.cross(horizon,p1)) # b2=canonize(numpy.cross(horizon,p2)) # b3=canonize(numpy.cross(horizon,p3)) # b4=canonize(numpy.cross(horizon,p4)) # print('#64',b1,b2,b3,b4) # self.intersections=[] # boardSize=4 # for r in range(boardSize): # self.intersections.append([None]*boardSize) # rowLine=numpy.cross(((b1*r+b2*(boardSize-1-r)) / (boardSize-1)), vanish1) # print('#80',rowLine) # for c in range(boardSize): # colLine=numpy.cross(((b3*c+b4*(boardSize-1-c)) / (boardSize-1)), vanish2) # print('#88',colLine) # self.intersections[r][c]=numpy.cross(rowLine,colLine) # x=Grid([Vector3(1,0,10),Vector3(1,10,10),Vector3(1,0,0),Vector3(1,10,0)]) x=Grid([[1,0,10],[1,7,7],[1,0,0],[1,10,0]]) for line in x.intersections: print('#96',line)