Algorithm 我的二维树的问题

Algorithm 我的二维树的问题,algorithm,tree,Algorithm,Tree,我使用二维树来包含我的形状。对于我的问题,让我们只关注X轴 因此,我根据项目的X值对树进行排序。假设B是第一个形状,然后我们将A添加到我的树中。我的算法是这样工作的(我写得更短,因为我们并不真正关心这一部分): 现在,这是我的问题。正如你所看到的,我的画上有一个红点。这是我单击以选择D项的位置,但它不起作用,因为算法是这样工作的: if(B.X > Mouse.X) go to C else if (B.X < Mouse.X) go to A etc... if(B.X>Mous

我使用二维树来包含我的形状。对于我的问题,让我们只关注X轴

因此,我根据项目的X值对树进行排序。假设B是第一个形状,然后我们将A添加到我的树中。我的算法是这样工作的(我写得更短,因为我们并不真正关心这一部分):

现在,这是我的问题。正如你所看到的,我的画上有一个红点。这是我单击以选择D项的位置,但它不起作用,因为算法是这样工作的:

if(B.X > Mouse.X)
go to C
else if (B.X < Mouse.X)
go to A
etc...
if(B.X>Mouse.X)
去C
else if(B.X
所以它转到不包含D的节点C,因此在最后它永远找不到D项

我提出了两个解决方案,但据我看来,这两个都是相当糟糕的

第一个解决方案:将所有最大的项目移动到我的树的顶部。因此,每次调整或添加项目时,我都必须检查它是否在两个轴上都包含其他项目

第二种解决方案:将D项作为A和C节点的子项。为此,我还检查了我的形状的最大X(这个算法也是一个简化的算法,我很确定一些部分也丢失了)

Add(新项目){
if(currentNode.minX>newItem.minX&¤tNode.maxX
你有更好的解决方案给我建议吗???因为我对他们两个都不满意


非常感谢!

一个用于

“我点击了什么?”


问题是在缓冲区中使用每个形状的不同颜色进行渲染,并读取映射到该缓冲区的鼠标点下的颜色。

@decltype\u auto

是的,但我不想使用经典的迭代算法来知道我点击了什么。因为如果我有25000个项目,可能需要很多时间才能找到选定的项目。这就是为什么我使用此算法:

if(currentNode.item.contains(mouse.position){
    currentNode.item.selected = true;
}
if(currentNode.minX < mouse.X)
    go to currentNode.LeftChild
else if(currentNode.minX > mouse.X)
    go to currentNode.RightChidld
if(currentNode.item.contains)(鼠标位置){
currentNode.item.selected=true;
}
if(currentNode.minXmouse.X)
转到currentNode.RightChidld
使用这个算法可以让我更快地找到一个项目。然而,它还不够好。这就是为什么,我要求其他的想法


此外,感谢您的回答。

您不需要在颜色代码中搜索套件。25000<2**16所以16位颜色编码就足够了,因此在<64K*ptr_大小中,您可以存储一个完美的散列,它提供了O(1)查找复杂性。@decltype_auto我认为ITbob所寻找的是如何优化二维KD树的重新平衡过程。每个人都知道哈希表和字典的O(1)查找,我认为对他来说真正重要的是二维间隔重新平衡。。。(也就是说,不是基于键值或hashfunction相关内容的东西)。
Add(newItem){
if(currentNode.minX > newItem.MinX && currentNode.maxX < newItem.MaxX){
    if(currentNode.LeftChild     == null)
        currentNode.LeftChild = new Item
    else
        go to currentNode.LeftChild 
    if(currentNode.RightChild    == null)
        currentNode.RightChild= new Item
    else
        go to currentNode.RightChild    
}else if(currentNode.minX < newItem.MinX){
    if(currentNode.LeftChild     == null)
        currentNode.LeftChild = new Item
    else
        go to currentNode.LeftChild 
}
if(currentNode.item.contains(mouse.position){
    currentNode.item.selected = true;
}
if(currentNode.minX < mouse.X)
    go to currentNode.LeftChild
else if(currentNode.minX > mouse.X)
    go to currentNode.RightChidld