Compare commits
No commits in common. "dev" and "main" have entirely different histories.
4 changed files with 2 additions and 185 deletions
|
@ -7,10 +7,10 @@ With this module, you can store data in files easyly.
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import json
|
import json
|
||||||
from deprecated import deprecated
|
from warnings import deprecated
|
||||||
|
|
||||||
|
|
||||||
@deprecated(reason="This function is not safe to use!!!")
|
@deprecated("This function is not safe to use!!!")
|
||||||
class DictFile:
|
class DictFile:
|
||||||
"""
|
"""
|
||||||
This class is not safe to use!
|
This class is not safe to use!
|
||||||
|
|
|
@ -1,93 +0,0 @@
|
||||||
#!/usr/bin/python3
|
|
||||||
|
|
||||||
from scipy.sparse import csc_array, csr_array
|
|
||||||
|
|
||||||
|
|
||||||
# --- How it works: (3D Matrix)---
|
|
||||||
# Matrices can only expand in all positive directions.
|
|
||||||
# That means, the zero point of the matrix stays at the same position while the matrix expands,
|
|
||||||
# but the opposite corner (where no xyz direction is zero) moves away from the zero point while it expands.
|
|
||||||
# If you draw a line through the zero point of the matrix and the opposite completely positive corner,
|
|
||||||
# you get the direction in that the matrix will expand. (this direction will change if you change the aspect ratio of -
|
|
||||||
# the matrix)
|
|
||||||
# But we need a matrix that can expand in the negative directions too.
|
|
||||||
# To create such a matrix, we use another matrix that we flip completely and put behind the zero point of a first -
|
|
||||||
# matrix, on the same expanding direction of the first matrix.
|
|
||||||
# Because the second matrix is flipped, our expanding direction can now go in the opposite direction,
|
|
||||||
# but because you cant create another cube from two cubes, we don't have a complete matrix.
|
|
||||||
# So we add six more matrices to make our infinite matrix expandable in the yz, x, y, xz, xy, z directions.
|
|
||||||
|
|
||||||
|
|
||||||
class Infinite3DMatrixCSC:
|
|
||||||
def __init__(self, size: tuple=(32, 32, 32), size_negative: tuple=(32, 32, 32)):
|
|
||||||
self.size = size
|
|
||||||
self.size_negative = size_negative
|
|
||||||
self.chunk_size = (
|
|
||||||
(size[0] + size_negative[0]) / 2,
|
|
||||||
(size[1] + size_negative[1]) / 2,
|
|
||||||
(size[2] + size_negative[2]) / 2
|
|
||||||
) # get average
|
|
||||||
|
|
||||||
px = size[0]
|
|
||||||
py = size[1]
|
|
||||||
pz = size[2]
|
|
||||||
nx = size_negative[0]
|
|
||||||
ny = size_negative[1]
|
|
||||||
nz = size_negative[2]
|
|
||||||
|
|
||||||
# if (
|
|
||||||
# not float(self.size[0]).is_integer() and
|
|
||||||
# not float(self.chunk_size[1]).is_integer() and
|
|
||||||
# not float(self.chunk_size[2]).is_integer()
|
|
||||||
# ): # if the size is possible
|
|
||||||
# raise ValueError("Cant calculate equal chunk size.")
|
|
||||||
|
|
||||||
self.xyz_matrix = csc_array(size) # create the 8 matrices
|
|
||||||
self.negative_matrix = csc_array(size_negative)
|
|
||||||
self.yz_matrix = csc_array((nx, py, pz))
|
|
||||||
self.x_matrix = csc_array((px, ny, nz))
|
|
||||||
self.y_matrix = csc_array((nx, py, nz))
|
|
||||||
self.xz_matrix = csc_array((px, ny, pz))
|
|
||||||
self.xy_matrix = csc_array((px, py, nz))
|
|
||||||
self.z_matrix = csc_array((nx, ny, pz)) # Nix, Nie, Pizza!
|
|
||||||
|
|
||||||
def __getitem__(self, item):
|
|
||||||
self.get_item(item)
|
|
||||||
|
|
||||||
def resize_matrices(self):
|
|
||||||
px = self.size[0]
|
|
||||||
py = self.size[1]
|
|
||||||
pz = self.size[2]
|
|
||||||
nx = self.size_negative[0]
|
|
||||||
ny = self.size_negative[1]
|
|
||||||
nz = self.size_negative[2]
|
|
||||||
|
|
||||||
self.xyz_matrix.resize(self.size)
|
|
||||||
|
|
||||||
|
|
||||||
def resize(self, new_size: tuple, new_size_negative: tuple):
|
|
||||||
if not new_size is None:
|
|
||||||
self.size = new_size
|
|
||||||
|
|
||||||
if not new_size_negative is None:
|
|
||||||
self.size_negative = new_size_negative
|
|
||||||
|
|
||||||
def expand(self, add_positive: tuple, add_negative: tuple):
|
|
||||||
if not add_positive is None:
|
|
||||||
self.size = coord_add(self.size, add_positive)
|
|
||||||
|
|
||||||
if not add_negative is None:
|
|
||||||
self.size_negative = coord_add(self.size_negative, add_negative)
|
|
||||||
|
|
||||||
def get_item(self, position: tuple):
|
|
||||||
x, y = position
|
|
||||||
|
|
||||||
|
|
||||||
def coord_add(coord1: tuple, coord2: tuple):
|
|
||||||
return coord1[0] + coord2[0], coord1[1] + coord2[1], coord1[2] + coord2[2]
|
|
||||||
|
|
||||||
def coord_sub(coord1: tuple, coord2: tuple):
|
|
||||||
return coord1[0] - coord2[0], coord1[1] - coord2[1], coord1[2] - coord2[2]
|
|
||||||
|
|
||||||
|
|
||||||
Infinite3DMatrixCSC((5, 5))
|
|
89
math/spvo.py
89
math/spvo.py
|
@ -1,89 +0,0 @@
|
||||||
#!/usr/bin/python3
|
|
||||||
|
|
||||||
"""
|
|
||||||
SPVO = Sparse Voxel Octree
|
|
||||||
|
|
||||||
A Sparse Voxel Octree is a way of storing multidimensional data. (In this case it is 3D Data.)
|
|
||||||
It works similarly to a Sparse Voxel Matrix, but it is a bit compressed.
|
|
||||||
In a Sparse Voxel Octree, you have a root-node. The root node gets split up into 8 child nodes,
|
|
||||||
which can be all split up into 8 more child nodes which can be split up too and so on.
|
|
||||||
Thanks to this "compression", there are no zero values on places where there is just air unlike as in a normal matrix.
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
class Node:
|
|
||||||
def __init__(self, data=None):
|
|
||||||
self.children = [None] * 8
|
|
||||||
self.leaf = True
|
|
||||||
|
|
||||||
self.data = data
|
|
||||||
|
|
||||||
|
|
||||||
class SparseVoxelOctree:
|
|
||||||
def __init__(self):
|
|
||||||
self.root_node = Node()
|
|
||||||
self.origin = (0, 0, 0)
|
|
||||||
|
|
||||||
def _get_child_index(self, x, y, z, size):
|
|
||||||
"""
|
|
||||||
Get the index of a child.
|
|
||||||
Index: The position of the node in the node parent's children list.
|
|
||||||
"""
|
|
||||||
|
|
||||||
index = 0
|
|
||||||
|
|
||||||
if x >= size // 2: # x pos
|
|
||||||
# there are only 2 possible x coordinate values in a 2x2 cube, so we use the 1st bit in index for x
|
|
||||||
# xyz: the coordinates of the parent node
|
|
||||||
index |= 1 # set 1st bit to 1
|
|
||||||
x -= size // 2 # get parent x
|
|
||||||
|
|
||||||
# and the same for y and z
|
|
||||||
|
|
||||||
if y >= size // 2: # y pos
|
|
||||||
index |= 2
|
|
||||||
y -= size // 2
|
|
||||||
|
|
||||||
if z >= size // 2: # z pos
|
|
||||||
index |= 4
|
|
||||||
z -= size // 2
|
|
||||||
|
|
||||||
return index, x, y, z
|
|
||||||
|
|
||||||
def _extend_tree(self, x, y, z):
|
|
||||||
new_root = Node()
|
|
||||||
new_root.leaf = False
|
|
||||||
|
|
||||||
index, nx, ny, nz = self._get_child_index(x, y, z, 2)
|
|
||||||
new_root.children[index] = self.root_node
|
|
||||||
self.root_node = new_root
|
|
||||||
|
|
||||||
self.origin = (
|
|
||||||
self.origin[0] - (x >= 0) * 2 + 1,
|
|
||||||
self.origin[1] - (y >= 0) * 2 + 1,
|
|
||||||
self.origin[2] - (z >= 0) * 2 + 1
|
|
||||||
)
|
|
||||||
|
|
||||||
def _insert(self, node, x, y, z, size):
|
|
||||||
while not size == 1:
|
|
||||||
index, x, y, z = self._get_child_index(x, y, z, size)
|
|
||||||
|
|
||||||
if node.children[index] is None:
|
|
||||||
node.children[index] = Node()
|
|
||||||
|
|
||||||
size //= 2
|
|
||||||
|
|
||||||
node.leaf = True
|
|
||||||
|
|
||||||
def insert(self, x, y, z):
|
|
||||||
# move origin if necessary
|
|
||||||
while not (0 <= x < 2 ** 30 and 0 <= y < 2 ** 30 and 0 <= z < 2 ** 30):
|
|
||||||
self._extend_tree(x, y, z)
|
|
||||||
|
|
||||||
x, y, z = (
|
|
||||||
x - self.origin[0],
|
|
||||||
y - self.origin[1],
|
|
||||||
z - self.origin[2]
|
|
||||||
)
|
|
||||||
|
|
||||||
self._insert(self.root_node, x, y, z, 2 ** 30)
|
|
|
@ -1 +0,0 @@
|
||||||
deprecated
|
|
Loading…
Reference in a new issue