예제 #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);
                                 }
                             }
                         }
                     }
                 }
             }
         }
     }
 }
예제 #2
0
 public bool Overlaps(TAABB use_aabb)
 {
     for (int i = 0; i < 3; i++)
     {
         if (NotOverlay(Get(i, 0), Get(i, 1), use_aabb.Get(i, 0), use_aabb.Get(i, 1)))
         {
             return(false);
         }
     }
     return(true);
 }
예제 #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);
                             }
                         }
                     }
                 }
             }
         }
     }
 }
예제 #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);
                             }
                         }
                     }
                 }
             }
         }
     }
 }