Ejemplo n.º 1
0
 void AABBQuery(TOctreeNode node, TVector <int> result, TAABB aabb)
 {
     if (node.is_end != -1)
     {
         result.Add(items[node.is_end]);
     }
     else
     {
         int i, k, t;
         for (i = 0; i < 2; i++)
         {
             if ((aabb.Get(0, i) < (node.dims.Get(0, 0) + node.dims.Get(0, 1)) * 0.5) != (i == 1))
             {
                 for (k = 0; k < 2; k++)
                 {
                     if ((aabb.Get(1, k) < (node.dims.Get(1, 0) + node.dims.Get(1, 1)) * 0.5) != (k == 1))
                     {
                         for (t = 0; t < 2; t++)
                         {
                             if ((aabb.Get(2, t) < (node.dims.Get(2, 0) + node.dims.Get(2, 1)) * 0.5) != (t == 1))
                             {
                                 if (node.GetChild(i, k, t) != -1)
                                 {
                                     AABBQuery(nodes[node.GetChild(i, k, t)], result, aabb);
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
 }
Ejemplo n.º 2
0
        void Init(int node, TAABB use_dims)
        {
            TOctreeNode new_node = new TOctreeNode();

            new_node.dims = use_dims;
            if ((new_node.dims.Get(0, 1) - new_node.dims.Get(0, 0)) < min_node_size * 2)
            {
                new_node.is_end        = items.New();
                items[new_node.is_end] = new TVector <int>(5);
            }
            nodes[node] = new_node;
        }
Ejemplo n.º 3
0
 void Add(TOctreeNode node, TAABB use_dims, int data)
 {
     if (node.is_end != -1)
     {
         for (int i = 0; i <= items[node.is_end].High; i++)
         {
             if (items[node.is_end][i] == data)
             {
                 Debug.Assert(false);                               //в узле дерева не должно быть повторяющихся значений
             }
         }
         items[node.is_end].Add(data);
     }
     else
     {
         int i, k, t;
         for (i = 0; i < 2; i++)
         {
             if ((use_dims.Get(0, i) < (node.dims.Get(0, 0) + node.dims.Get(0, 1)) * 0.5) != (i == 1))
             {
                 for (k = 0; k < 2; k++)
                 {
                     if ((use_dims.Get(1, k) < (node.dims.Get(1, 0) + node.dims.Get(1, 1)) * 0.5) != (k == 1))
                     {
                         for (t = 0; t < 2; t++)
                         {
                             if ((use_dims.Get(2, t) < (node.dims.Get(2, 0) + node.dims.Get(2, 1)) * 0.5) != (t == 1))
                             {
                                 if (node.GetChild(i, k, t) == -1)
                                 {
                                     node.SetChild(i, k, t, nodes.New());
                                     TAABB temp = node.dims;
                                     temp.ToSubCube(i, k, t);
                                     Init(node.GetChild(i, k, t), temp);
                                 }
                                 Add(nodes[node.GetChild(i, k, t)], use_dims, data);
                             }
                         }
                     }
                 }
             }
         }
     }
 }
Ejemplo n.º 4
0
 void Del(TOctreeNode node, TAABB use_dims, int data)
 {
     if (node.is_end != -1)
     {
         bool found = false;
         for (int i = 0; i <= items[node.is_end].High; i++)
         {
             if (items[node.is_end][i] == data)
             {
                 found = true;
                 items[node.is_end].Del(i);
                 break;
             }
         }
         if (!found)
         {
             Debug.Assert(false);        //значение должно присутствовать
         }
     }
     else
     {
         int i, k, t;
         for (i = 0; i < 2; i++)
         {
             if ((use_dims.Get(0, i) < (node.dims.Get(0, 0) + node.dims.Get(0, 1)) * 0.5) != (i == 1))
             {
                 //TODO из-за погрешностей вычислений могут возникнуть проблемы в void Del(TOctreeNode node, TAABB use_dims, int data)
                 for (k = 0; k < 2; k++)
                 {
                     if ((use_dims.Get(1, k) < (node.dims.Get(1, 0) + node.dims.Get(1, 1)) * 0.5) != (k == 1))
                     {
                         for (t = 0; t < 2; t++)
                         {
                             if ((use_dims.Get(2, t) < (node.dims.Get(2, 0) + node.dims.Get(2, 1)) * 0.5) != (t == 1))
                             {
                                 Del(nodes[node.GetChild(i, k, t)], use_dims, data);
                             }
                         }
                     }
                 }
             }
         }
     }
 }
Ejemplo n.º 5
0
 void RayQuery(TOctreeNode node, TVector <int> result, TRay ray)
 {
     if (node.is_end != -1)
     {
         result.Add(items[node.is_end]);
     }
     else
     {
         for (int i = 0; i < 8; i++)
         {
             if (node.child[i] != -1)
             {
                 if (nodes[node.child[i]].dims.Overlaps(ray))
                 {
                     RayQuery(nodes[node.child[i]], result, ray);
                 }
             }
         }
     }
 }