i は次の四分木のような構造を持ち、各セルは内部ノードまたはリーフのいずれかになります。葉であれば、色を保存できます。内部ノードの場合は、4 つの子 (リーフまたは内部ノードのいずれか) へのポインターを格納します。
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() があります。
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() をデバッグしています。私は行にデバッグポイントを設定します
children[0] = new RenderBucketCell(rt,gt,bt,at, xt2, yt2);
だから今:デバッガーはこの行で停止し、メンバー値を観察します。行が実行されるように手順ステップを実行します(命令カーソルは次の行にあります)。行が実行された後、children[0] のポインター値は同じままです。代わりに、children[2] のポインタ値が (float 値 b とともに) 変更されました。
誰かが私にこの振る舞いを説明できますか?? 私は何を間違っていますか?
ありがとう!