From 545235e9bbace5f362b8dc6efc378b4fae085360 Mon Sep 17 00:00:00 2001 From: Tobias Kessels Date: Wed, 2 Jan 2019 10:30:27 +0100 Subject: [PATCH] cleaned up puzzlebox stuff --- cube_puzzle.txt => puzzlebox/solution | 0 solve.py => puzzlebox/solve.py | 0 puzzlebox/solve0.py | 85 +++++++++++++++++++++++++++ solve2.py => puzzlebox/solve2.py | 0 puzzlebox/voxels.py | 70 ++++++++++++++++++++++ 5 files changed, 155 insertions(+) rename cube_puzzle.txt => puzzlebox/solution (100%) rename solve.py => puzzlebox/solve.py (100%) create mode 100644 puzzlebox/solve0.py rename solve2.py => puzzlebox/solve2.py (100%) create mode 100644 puzzlebox/voxels.py diff --git a/cube_puzzle.txt b/puzzlebox/solution similarity index 100% rename from cube_puzzle.txt rename to puzzlebox/solution diff --git a/solve.py b/puzzlebox/solve.py similarity index 100% rename from solve.py rename to puzzlebox/solve.py diff --git a/puzzlebox/solve0.py b/puzzlebox/solve0.py new file mode 100644 index 0000000..0a30f12 --- /dev/null +++ b/puzzlebox/solve0.py @@ -0,0 +1,85 @@ +import numpy as np +import math +from operator import add +import matplotlib.pyplot as plt +import pprint +from mpl_toolkits.mplot3d import Axes3D + +# g_cube=np.zeros((10,10,10)) +n=6 +g_cube=[[[0 for k in range(0,n)] for j in range(0,n)] for i in range(0,n)] + +form=[[0,0,0],[1,0,0],[2,0,0],[3,0,0],[2,1,0]] + + + +def set_origin(form,index): + newform=list() + for x in form: + newform.append(np.subtract(x,form[index])) + return newform + +def vector_rotate(vector,angle,axis): + if axis=='x': + result=[vector[0],( ( vector[1]*math.cos(angle) ) - ( vector[2]*math.sin(angle) ) ),( ( vector[1]*math.sin(angle) ) + ( vector[2]*math.cos(angle) ) )] + if axis=='y': + result=[( ( vector[0]*math.cos(angle) ) + ( vector[2]*math.sin(angle) ) ),vector[1],( ( -vector[0]*math.sin(angle) ) + ( vector[2]*math.cos(angle) ) )] + if axis=='z': + result=[( ( vector[0]*math.cos(angle) ) - ( vector[1]*math.sin(angle) ) ),( ( vector[0]*math.sin(angle) ) + ( vector[1]*math.cos(angle) ) )] + + +def form_in_cube(form): + for cursor in form: + for element in cursor: + if element<=0 or element>=n: + return False + return True + +def put_in(form,cube,offset,piece=1): + form_positions=[(x+offset[0],y+offset[1],z+offset[2]) for (x,y,z) in form] + # form_positions=list([map(add,p,offset) for p in form]) + + if form_in_cube(form_positions): + for cursor in form_positions: + cube[cursor[0]][cursor[1]][cursor[2]]=piece + print("set ({},{},{}) to {}".format(cursor[0],cursor[1],cursor[2],piece)) + else: + print("out") + +def draw_field(g_cube): + # g_cube=np.zeros((6,6,6)) + # g_cube=cube + # prepare some coordinates + # x, y, z = np.indices((6, 6, 6)) + x, y, z = np.indices((len(g_cube),len(g_cube[0]), len(g_cube[0][0]))) + farben=["red","blue","green","cyan","magenta","yellow"] + + list_of_cubes =list() + for x_pos in range(0,len(g_cube)): + for y_pos in range(0,len(g_cube[x_pos])): + for z_pos in range(0,len(g_cube[x_pos][y_pos])): + color=(g_cube[x_pos][y_pos][z_pos]) + if color>0: + print("Voxel by ({},{},{}) : {}".format(x_pos,y_pos,z_pos,type(g_cube[x_pos][y_pos][z_pos]))) + farbe=farben[int((color+1)%len(farben))] + list_of_cubes.append({"cube":(x < x_pos) & (x >= (x_pos-1) ) & (y < y_pos) & (y >= (y_pos-1) ) & (z < z_pos) & (z >= (z_pos-1) ),"farbe":farbe}) + + + voxels=list_of_cubes[0]["cube"] + colors = np.empty(voxels.shape, dtype=object) + + for x in list_of_cubes: + voxels=voxels | x["cube"] + colors[x["cube"]]=x["farbe"] + + fig = plt.figure() + ax = fig.gca(projection='3d') + ax.voxels(voxels, facecolors=colors, edgecolor='k') + plt.show() + + +put_in(set_origin(form,3),g_cube,(1,2,1),1) +put_in(set_origin(form,4),g_cube,(2,2,2),2) +put_in(set_origin(form,3),g_cube,(3,2,3),1) +put_in(set_origin(form,4),g_cube,(4,2,4),2) +draw_field(g_cube) diff --git a/solve2.py b/puzzlebox/solve2.py similarity index 100% rename from solve2.py rename to puzzlebox/solve2.py diff --git a/puzzlebox/voxels.py b/puzzlebox/voxels.py new file mode 100644 index 0000000..e87acf1 --- /dev/null +++ b/puzzlebox/voxels.py @@ -0,0 +1,70 @@ +''' +========================== +3D voxel / volumetric plot +========================== + +Demonstrates plotting 3D volumetric objects with ``ax.voxels`` +''' + +import matplotlib.pyplot as plt +import numpy as np +import pprint + +# This import registers the 3D projection, but is otherwise unused. +from mpl_toolkits.mplot3d import Axes3D # noqa: F401 unused import + +g_cube=np.zeros((6,6,6)) +# prepare some coordinates +x, y, z = np.indices((6, 6, 6)) +farben=["red","blue","green","cyan","magenta","yellow"] +g_cube[2][2][2]=1 +g_cube[3][1][1]=2 +g_cube[5][5][5]=2 + +list_of_cubes =list() +color_counter=0 +for x_pos in range(0,len(g_cube)): + for y_pos in range(0,len(g_cube[x_pos])): + for z_pos in range(0,len(g_cube[x_pos][y_pos])): + if g_cube[x_pos][y_pos][z_pos]!=0: + print("Voxel by ({},{},{})".format(x_pos,y_pos,z_pos)) + list_of_cubes.append({"cube":(x < x_pos) & (x >= (x_pos-1) ) & (y < y_pos) & (y >= (y_pos-1) ) & (z < z_pos) & (z >= (z_pos-1) ),"farbe":farben[color_counter]}) + color_counter=(color_counter + 1) % len (farben) + +voxels=list_of_cubes[0]["cube"] +colors = np.empty(voxels.shape, dtype=object) + +for x in list_of_cubes: + voxels=voxels | x["cube"] + colors[x["cube"]]=x["farbe"] + +fig = plt.figure() +ax = fig.gca(projection='3d') +ax.voxels(voxels, facecolors=colors, edgecolor='k') + +plt.show() + + + + + # draw cuboids in the top left and bottom right corners, and a link between them +# +# cube1 = (x < 3) & (y < 3) & (z < 3) +# cube2 = (x >= 5) & (y >= 5) & (z >= 5) +# link = abs(x - y) + abs(y - z) + abs(z - x) <= 2 +# +# # combine the objects into a single boolean array +# voxels = cube1 | cube2 | link +# +# # set the colors of each object +# colors = np.empty(voxels.shape, dtype=object) +# colors[link] = 'red' +# colors[cube1] = 'blue' +# colors[cube2] = 'green' +# +# # and plot everything +# fig = plt.figure() +# ax = fig.gca(projection='3d') +# ax.voxels(voxels, facecolors=colors, edgecolor='k') +# +# plt.show()