Changeset - 2d154acad949
[Not reviewed]
default
0 1 0
Laman - 7 years ago 2018-06-26 23:33:05

výčet rotací a posunů
1 file changed with 42 insertions and 21 deletions:
pieces.py
42
21
0 comments (0 inline, 0 general)
pieces.py
Show inline comments
 
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)
 

	
 
	return res
 

	
 

	
 
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
 
	res=[]
 

	
 
	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)
 
	return res
 

	
 

	
 
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
 
		[[1,2,3], # y,x
 
		[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)
0 comments (0 inline, 0 general)