C# 最小边界四叉树节点

C# 最小边界四叉树节点,c#,algorithm,quadtree,C#,Algorithm,Quadtree,我正在编写一个基于整数的四叉树结构,它是从节点开始构建的,而不是从节点开始构建的。为此,我需要发现下一个最大的节点,它包含我的所有元素。如果定义了一个预先存在的节点,然后尝试在该节点的边界之外添加一个项,则需要创建一个更大的节点来包含这两个节点。我有(我认为很聪明的)代码来查找单个点周围的边界框: public static Rectangle BoundingRectangle(Point p, int magnitude) { Rectangle bounds = new Recta

我正在编写一个基于整数的四叉树结构,它是从节点开始构建的,而不是从节点开始构建的。为此,我需要发现下一个最大的节点,它包含我的所有元素。如果定义了一个预先存在的节点,然后尝试在该节点的边界之外添加一个项,则需要创建一个更大的节点来包含这两个节点。我有(我认为很聪明的)代码来查找单个点周围的边界框:

public static Rectangle BoundingRectangle(Point p, int magnitude)
{
    Rectangle bounds = new Rectangle()
    {
        X = (p.X & ~((1 << magnitude) - 1)),
        Y = (p.Y & ~((1 << magnitude) - 1)),
        Width = (1 << magnitude),
        Height = (1 << magnitude)
    };
    return bounds;
}

实施:

Rectangle(X,Y,1,1) -> Rectangle(X,Y,1,1)
Rectangle(0,0,2,2) -> Rectangle(0,0,2,2)
Rectangle(1,1,2,2) -> Rectangle(0,0,4,4)
Rectangle(1,1,3,3) -> Rectangle(0,0,4,4)
Rectangle(0,5,2,2) -> Rectangle(0,4,4,4)
Rectangle(3,3,2,2) -> Rectangle(0,0,8,8)
private static int BitScanReverse(int mask)
{
    int index = 0;
    while (mask > 1)
    {
        mask >>= 1;
        index++;
    }
    return index;
}

public static Rectangle BoundingRectangle(Point p, int magnitude)
{
    Rectangle bounds = new Rectangle()
    {
        X = (p.X & ~((1 << magnitude) - 1)),
        Y = (p.Y & ~((1 << magnitude) - 1)),
        Width = (1 << magnitude),
        Height = (1 << magnitude)
    };
    return bounds;
}

public static Rectangle BoundingRectangle(Rectangle r, int magnitude)
{
    int msb = BitScanReverse((r.X ^ (r.X + r.Width - 1)) | (r.Y ^ (r.Y + r.Height - 1)));
    return BoundingRectangle(r.Location, Math.Max(msb + 1, magnitude));
}
私有静态int位扫描反转(int掩码)
{
int指数=0;
while(掩码>1)
{
掩码>>=1;
索引++;
}
收益指数;
}
公共静态矩形边界矩形(点p,整数幅值)
{
矩形边界=新矩形()
{

x=(px&~(1)p>让我们考虑这个第一个版本。代替矩形,我们有一个偏移和长度。

边界矩形的“大小”告诉您要忽略多少位

假设offset=1234,length=56。我们希望忽略足够的位,以便“offset”(1234)和“offset+length-1”(1289)映射到相同的数字

1234 = 10011010010
1289 = 10100001001
显然,我们需要忽略除前2位以外的所有位(忽略9位)

我们可以通过1234 XOR 1289(即475)以编程方式找到这一点

然后找到475的最高有效位。大多数处理器都有此指令(在Windows上,它是_BitScanReverse)

现在,对于2D情况,我们需要得到X轴和Y轴的XOR。然后,我们或这两个结果一起。最后,找到最重要的集合位

因此,在伪代码中:

magnitude = MSBof( ( X ^ (X+width-1) ) | ( Y ^ (Y+height-1) ) )

要得到实际的矩形,只需使用post中的函数。传入新的点(X,Y).

这个问题太棒了。如果到时候还没有答案,我会在家里解决。谢谢。这让我有点烦。我想我会向更聪明的人大声喊叫。=]你打算如何处理重叠多个四叉树节点的矩形?即(1,1,3,3)重叠4个宽/高节点2。如果你想说它在(0,0,4,4)内然后你总是在树的根(最大的节点)中有一些小东西。你还会把它放在哪里?矩形(1,1,3,3)会放在节点(0,0,4,4)中,然后如果添加一个矩形(0,4,2,2),它会放在节点(0,4,4,4,4),这两个节点都会放在一个新的根节点(0,0,8,8)中。矩形(1,1,1)不应该映射到矩形吗(1,1,1,1)?这看起来不错,但我找不到一种方法在c#中实现
MSBof
,而不进行大量的位旋转。有什么建议吗?很好的建议。我使用了位旋转,但效果非常好。我在上面发布了我的实现。好的,太好了!实现中有一个小毛病:使用“while(mask>0)”而不是“while(mask>1)”。以后您不需要使用+1来修复它。以下是其他实现:我已经完成了我正在处理的结构,并且它一直在很好地使用此方法。再次感谢,如果您想评论我的类,您可以在以下答案中找到它:
magnitude = MSBof( ( X ^ (X+width-1) ) | ( Y ^ (Y+height-1) ) )