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); } } } } } } } } }
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); }
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); } } } } } } } }
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); } } } } } } } }