import numpy as np
board=[[0]*4 for r in range(3)]
steamboat=[[0,0,0],[1,1,1],[0,1,0]]
def rotate(obj,axis,multiple):
"""[ # z
[[1,2,3], # y,x
@@ -25,7 +21,7 @@ def rotate(obj,axis,multiple):
shape_=abs(np.dot(shape,m))
middle=(shape-1)/2
middle_=(shape_-1)/2
res=np.zeros(shape_)
res=np.zeros(shape_,np.int32)
for (z,plane) in enumerate(obj):
for (y,row) in enumerate(plane):
@@ -37,8 +33,35 @@ def rotate(obj,axis,multiple):
return res
def fits(board,piece,offset):
(dz,dy,dx)=offset
def listRotations(obj):
rots=[(0,0),(1,1),(1,2),(1,3),(2,1),(2,3)]
res=[]
configs=set()
for (axis,multiple) in rots: # každou stěnu natočíme nahoru
obj_=rotate(obj,axis,multiple)
for i in range(4): # a protočíme kolem z
obj__=rotate(obj_,0,i)
h=(obj__.shape,obj__.tobytes()) # zbavíme se symetrií
if h not in configs:
res.append(obj__)
configs.add(h)
def listShifts(board,obj):
return [
(dz,dy,dx)
for dz in range(board.shape[0]-obj.shape[0]+1)
for dy in range(board.shape[1]-obj.shape[1]+1)
for dx in range(board.shape[2]-obj.shape[2]+1)
]
def fits(board,piece,shift):
(dz,dy,dx)=shift
for (z,plane) in enumerate(piece):
@@ -46,24 +69,22 @@ def fits(board,piece,offset):
for (x,item) in enumerate(row):
if item==0: continue
coords=(z+dz,y+dy,x+dx)
if board[coords]: return None
if board[coords]: return False
res.append(coords)
if __name__=="__main__":
# for r in range(-2,3):
# for c in range(-2,4):
# x=fits(board,steamboat,(r,c))
# if x: print((r,c),x)
board=np.zeros((1,2,3))
boat=np.array([[[0,1,0],[1,1,1]]])
es=np.array([[[1,1,0],[0,1,1]]])
el=np.array([[[1,1,1],[1,0,0]]])
# print(rotZ([[0,1,0,0],[0,1,0,0],[0,1,0,0],[0,0,0,0]]))
pieces={"boat":boat}
arr=np.array([ # z
[4,5,6]],
[[7,8,9],
[10,11,12]]
])
print(rotate(arr,2,4))
for (name,piece) in pieces.items():
for p in listRotations(piece):
for shift in listShifts(board,p):
fit=fits(board,p,shift)
if fit is not False:
print(fit)
Status change: