Exemplo n.º 1
0
 def test_with_64_voxels(self):
     vo = Node.get_all_voxels_vertex([0, 0, 0], 2)
     voxels = []
     for i in vo:
         temp = Node.get_all_voxels_vertex(i, 1)
         for t in temp:
             voxels.append(t)
     tree = get_octree(voxels, 1)
     tree.fill_tree()
     res = [i for i in tree.get_all_crossing([[0, 0, 0], [0, 4, 0], [4, 0, 0]], tree.Start)]
     self.assertEqual(13, len(res))
     self.assertEqual(46, len(tree.Start.Objects))
Exemplo n.º 2
0
    def __init__(self, objects: [], size_voxel: [], ep: [], is_voxels=False):
        """

        :param objects: объекты для хранения в дереве
        :param size_voxel: размер вокселя
        :param ep: крайние точки модели
        :param is_voxels: объекты дерева - воксели?
        """
        max_size_model = max(*[i[1] - i[0] for i in ep])
        self.Start = Node(None, max_size_model, [point[0] for point in ep])
        self.Start.add_objects(objects)
        self.Size_voxel = size_voxel
        self.Is_voxels = is_voxels
Exemplo n.º 3
0
 def test_with_voxels_in_child(self):
     # TODO
     #  Работает правильно, но лень настраивать тест
     voxels = Node.get_all_voxels_vertex([0, 0, 0], 1)
     v = []
     for i in voxels:
         temp = Node.get_all_voxels_vertex(i, 0.5)
         for t in temp:
             if 2 not in t:
                 v.append(t)
     tree = Octree(v, 0.5, [[0, 4], [0, 4], [0, 4]], True)
     tree._fill_tree(tree.Start)
     print(1)
Exemplo n.º 4
0
 def _get_children_for_checked(vertexes: [], node: Node):  # Tested
     """
     Определяет, каких потомков проверять дальше
     :param vertexes список вершин
     :return: ленивый список потомкав
     """
     children = []
     for vert in vertexes:
         location = node.get_location_point(vert)
         if 0 in location:
             continue
         if location not in children:
             children.append(location)
             yield node.get_child(location)
Exemplo n.º 5
0
 def _fill_tree(self, node: Node):  # Tested
     """
     Заполнение дерева
     :param node: вершина
     :return:
     """
     if node.Size <= self.Size_voxel or (
             str(type(node.Objects)) != "<class 'generator'>"
             and len(node.Objects) <= 1):
         return
     if len(node.Children) == 0:
         node.add_children()
     node.distribute(self.Is_voxels, self.Size_voxel)
     for child in node.Children:
         self._fill_tree(child)
Exemplo n.º 6
0
 def test_with_8_voxels(self):
     voxels = Node.get_all_voxels_vertex([0, 0, 0], 3)
     node = get_simple_node()
     node.add_objects(voxels)
     node.distribute(True, 1)
     for i in node.Children:
         self.assertEqual(1, len(i.Objects))
     self.assertEqual(0, len(node.Objects))
Exemplo n.º 7
0
 def test_distribute_child(self):
     voxels = Node.get_all_voxels_vertex([0, 0, 0], 2)
     v = []
     for i in voxels:
         temp = Node.get_all_voxels_vertex(i, 1)
         for t in temp:
             v.append(t)
     voxels = []
     for i in v:
         temp = Node.get_all_voxels_vertex(i, 0.5)
         for t in temp:
             voxels.append(t)
     node = get_simple_node(4)
     node.add_objects(voxels)
     node.distribute(True, 0.5)
     for i in node.Children:
         self.assertEqual(27, len(i.Objects))
         i.add_children()
Exemplo n.º 8
0
    def test_with_8_voxels(self):
        voxels = Node.get_all_voxels_vertex([0, 0, 0], 2)
        tree = get_octree(voxels, 2)
        tree.fill_tree()
        mesh = [[0, 0, 0], [3, 1, 0], [2, 3, 0]]
        res = [i for i in tree.get_all_crossing(mesh, tree.Start)]
        self.assertEqual(4, len(res))
        self.assertEqual([[0, 0, 0], [0, 2, 0], [2, 0, 0], [2, 2, 0]], res)
        self.assertEqual(4, len(tree.Start.Objects))

        mesh = [[3, 0, 3], [4, 0, 4], [4, 1, 4]]
        res = [i for i in tree.get_all_crossing(mesh, tree.Start)]
        self.assertEqual(1, len(res))
        self.assertEqual([[2, 0, 2]], res)
        self.assertEqual(3, len(tree.Start.Objects))
Exemplo n.º 9
0
 def get_all_crossing(self, object_checked, node: Node):  # Tested
     """
     Предназначена для возвращения вокселей, когда они находятся в дереве
     :param object_checked: Меш
     :param node: проверяемая вершина. Для начала поиска указать стартовую
     :return:
     """
     not_crossing = []
     for ob in node.Objects:
         if Crossing.crossing(object_checked, ob, self.Size_voxel):
             yield ob
         else:
             not_crossing.append(ob)
     node.Objects = not_crossing
     if len(node.Children) > 0:
         for child in self._get_children_for_checked(object_checked, node):
             temp = self.get_all_crossing(object_checked, child)
             for i in temp:
                 yield i
Exemplo n.º 10
0
class Octree:
    def __init__(self, objects: [], size_voxel: [], ep: [], is_voxels=False):
        """

        :param objects: объекты для хранения в дереве
        :param size_voxel: размер вокселя
        :param ep: крайние точки модели
        :param is_voxels: объекты дерева - воксели?
        """
        max_size_model = max(*[i[1] - i[0] for i in ep])
        self.Start = Node(None, max_size_model, [point[0] for point in ep])
        self.Start.add_objects(objects)
        self.Size_voxel = size_voxel
        self.Is_voxels = is_voxels

    def fill_tree(self):
        self._fill_tree(self.Start)

    def _fill_tree(self, node: Node):  # Tested
        """
        Заполнение дерева
        :param node: вершина
        :return:
        """
        if node.Size <= self.Size_voxel or (
                str(type(node.Objects)) != "<class 'generator'>"
                and len(node.Objects) <= 1):
            return
        if len(node.Children) == 0:
            node.add_children()
        node.distribute(self.Is_voxels, self.Size_voxel)
        for child in node.Children:
            self._fill_tree(child)

    def get_first_crossing(self, object_checked, node: Node):
        """
        Предназначена для возвращения первого персечения с мешем, когда меши в дереве
        :param object_checked: воксель
        :param node: проверяемая вершина, для начала поиска указать стартовую
        :return:
        """
        for ob in node.Objects:
            if Crossing.crossing(ob, object_checked, self.Size_voxel):
                return ob
        if len(node.Children) > 0:
            for child in self._get_children_for_checked(
                    self._get_all_voxels_vertex(object_checked,
                                                self.Size_voxel), node):
                temp = self.get_first_crossing(object_checked, child)
                if temp is not None:
                    return temp

    def get_all_crossing(self, object_checked, node: Node):  # Tested
        """
        Предназначена для возвращения вокселей, когда они находятся в дереве
        :param object_checked: Меш
        :param node: проверяемая вершина. Для начала поиска указать стартовую
        :return:
        """
        not_crossing = []
        for ob in node.Objects:
            if Crossing.crossing(object_checked, ob, self.Size_voxel):
                yield ob
            else:
                not_crossing.append(ob)
        node.Objects = not_crossing
        if len(node.Children) > 0:
            for child in self._get_children_for_checked(object_checked, node):
                temp = self.get_all_crossing(object_checked, child)
                for i in temp:
                    yield i

    @staticmethod
    def _get_children_for_checked(vertexes: [], node: Node):  # Tested
        """
        Определяет, каких потомков проверять дальше
        :param vertexes список вершин
        :return: ленивый список потомкав
        """
        children = []
        for vert in vertexes:
            location = node.get_location_point(vert)
            if 0 in location:
                continue
            if location not in children:
                children.append(location)
                yield node.get_child(location)

    @staticmethod
    def _get_all_voxels_vertex(voxel: [], size: float):  # Tested
        """
        Генерирует все вершины вокселя
        :param voxel: воксель
        :param size: размер вокселя
        :return: ленивый список вершин вокселя
        """
        if size < 0:
            raise Exception("size_voxel can't be less than zero")
        for x in range(2):
            for y in range(2):
                for z in range(2):
                    yield [
                        x * size + voxel[0], y * size + voxel[1],
                        z * size + voxel[2]
                    ]

    @staticmethod
    def get_all_voxels(start_point: [], size_voxel: float, max_size: float):
        z = 0
        while z < max_size:
            y = 0
            while y < max_size:
                x = 0
                while x < max_size:
                    yield [
                        start_point[0] + x, start_point[1] + y,
                        start_point[2] + z
                    ]
                    x += size_voxel
                y += size_voxel
            z += size_voxel
def get_all_points(voxels: [], size: int):
    res = []
    for i in voxels:
        [res.append(j) for j in Node.get_all_voxels_vertex(i, size)]
    return res
Exemplo n.º 12
0
def get_simple_node(size=4.0, position=[0.0, 0.0, 0.0]):
    return Node(None, size, position)