首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >quadTree和联合的问题

quadTree和联合的问题
EN

Stack Overflow用户
提问于 2009-11-20 21:29:03
回答 4查看 586关注 0票数 2

我有以下类似四叉树的结构,其中每个单元既可以是内部节点,也可以是叶。如果它是一片叶子,它可以存储颜色。如果它是一个内部节点,它存储指向四个子节点的指针(可以是叶子节点,也可以是内部节点):

代码语言:javascript
复制
class RenderBucketCell{
public:
    RenderBucketCell();
    RenderBucketCell(float R, float G, float B, float A, unsigned short X, unsigned short Y);
    ~RenderBucketCell();

    void split();

    void collapse();

    bool isLeaf;
    RenderBucketCell* neighbours[8];
    unsigned short x;
    unsigned short y;
    union{
        struct{
            float r;
            float g;
            float b;
            float a;
        };
        struct{
            RenderBucketCell* children[4];
        };
    };
};

如果单元格是一个内部节点,那么它不需要存储颜色。如果它是一个叶子,那么它就不需要存储指向孩子的指针。因此,颜色和孩子应该共享相同的记忆(联合)

有一个函数split(),它将叶子转换为内部节点,并为子节点(叶子)创建与当前单元格具有相同颜色的子节点:

代码语言:javascript
复制
void RenderBucketCell::split(){
isLeaf=false;
float rt = r;//make backups of the values before setting the children (union)
float gt = g;
float bt = b;
float at = a;
unsigned short xt2 = x*2;
unsigned short yt2 = y*2;
children[0] = new RenderBucketCell(rt,gt,bt,at, xt2, yt2);
children[1] = new RenderBucketCell(rt,gt,bt,at, xt2+1, yt2);
children[2] = new RenderBucketCell(rt,gt,bt,at, xt2, yt2+1);
children[3] = new RenderBucketCell(rt,gt,bt,at, xt2+1, yt2+1);
}

现在我正在调试函数split()。我在线路上设置了一个调试点

代码语言:javascript
复制
children[0] = new RenderBucketCell(rt,gt,bt,at, xt2, yt2);

现在:调试器在此行停止,我观察到成员值。我做了一个程序步骤,这样一行就会被执行(指令光标现在在下一行)。行执行完后,子代的指针值仍然是一样的!相反,children2的指针值已更改(与浮点值b一起)

有人能给我解释一下这种行为吗?我做错了什么?

谢谢!

EN

回答 4

Stack Overflow用户

发布于 2009-12-10 02:07:42

在您的联盟中,您正在使用可以称为“匿名结构”的东西。我不相信这些是C++标准的一部分,尽管我读到一些编译器支持它们。在所有情况下,我都会避免使用这些方法,并使用以下方法:

代码语言:javascript
复制
union{
        struct {
                float r;
                float g;
                float b;
                float a;
        } color;
        struct {
                RenderBucketCell* children[4];
        } subnode;
};

由于您必须引用renderBucketCell.color.r而不是renderBucketCell.r,因此您的代码将略显冗长,但它可以解决您的问题。

票数 1
EN

Stack Overflow用户

发布于 2009-11-21 07:25:01

这很可能是使用联合的问题。children2是编译器提供给联合的第一个未分配的内存位置(假设4字节浮点数和8字节指针)。我不确定为什么会发生这种情况,但像这样的问题是工会不是可取结构的主要原因之一。

票数 0
EN

Stack Overflow用户

发布于 2009-11-21 07:37:44

我解决了你的问题(一个节点既可以有指针也可以有数据),方法是给节点四个无符号的长整型,当节点是一个子节点时,这些无符号的长整型被转换成浮点型。当它是父节点时,它们会存储子节点的地址。

但是,您必须绝对确定您想要使用此优化,因为它将成为调试的噩梦。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1770426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档