CXCORE リファレンス マニュアル
- 基本構造体(Basic Structures)
- 配列操作(Operations on Arrays)
- 動的構造体(Dynamic Structures)
- 描画関数(Drawing Functions)
- データ永続性と実行時型情報(Data Persistence and RTTI)
- その他の関数(Miscellaneous Functions)
- エラーハンドリングとシステム関数(Error Handling and System Functions)
動的構造体(Dynamic Structures)
木(Trees)
CV_TREE_NODE_FIELDS
ツリーノードの種類を宣言するための補助マクロ
#define CV_TREE_NODE_FIELDS(node_type) ¥ int flags; /* 様々なフラグ */ ¥ int header_size; /* シーケンスヘッダのサイズ */ ¥ struct node_type* h_prev; /* 一つ前のシーケンスへのポインタ */ ¥ struct node_type* h_next; /* 一つ後のシーケンスへのポインタ */ ¥ struct node_type* v_prev; /* 一つ前のシーケンスへのポインタ(セカンダリ,構造によって意味が異なる) */ ¥ struct node_type* v_next; /* 一つ後のシーケンスへのポインタ(セカンダリ,構造によって意味が異なる) */
マクロCV_TREE_NODE_FIELDS()は,すべての動的構造の基本タイプである CvSeqのように, 階層構造(ツリー)として組織化できるデータ構造を宣言するために使用される. このマクロを用いて宣言されたノードから構成されるツリーは,このセクションで述べる各関数を用いて処理することができる.
CvTreeNodeIterator
ツリーノードのイテレータのための構造体
typedef struct CvTreeNodeIterator { const void* node; int level; int max_level; } CvTreeNodeIterator;
構造体 CvTreeNodeIterator は,ツリーを走査するために用いられる. ツリーのノードの宣言には,マクロCV_TREE_NODE_FIELDS(...)を用いる必要がある.
InitTreeNodeIterator
ツリーノードのイテレータを初期化する
void cvInitTreeNodeIterator( CvTreeNodeIterator* tree_iterator,
const void* first, int max_level );
- tree_iterator
- 初期化されるツリーのイテレータ.
- first
- 先頭ノード.ここから走査を開始する.
- max_level
- ツリー走査範囲の最大レベル(first ノードが第1レベルであると仮定する). 例えば,1 はfirstと同じレベルのノードのみが処理されることを意味する, また,2はfirstと同じレベルのノードとその子ノードが処理される.
関数 cvInitTreeNodeIterator は,ツリーのイテレータを初期化する.ツリーは深さ優先で走査される.
NextTreeNode
現在のノードを返し,イテレータを次のノードに移動させる.
void* cvNextTreeNode( CvTreeNodeIterator* tree_iterator );
- tree_iterator
- 初期化されるツリーのイテレータ.
関数 cvNextTreeNode は,現在対象となっているノードを返し,その後イテレータを更新する(次のノードに移動させる). つまり,この関数の動作は,通常のC言語のポインタでの *p++ 表現,あるいはC++のコレクションイテレータとほぼ同じである. これ以上のノードがない場合,この関数はNULLを返す.
PrevTreeNode
現在のノードを返し,イテレータを前のノードに移動させる.
void* cvPrevTreeNode( CvTreeNodeIterator* tree_iterator );
- tree_iterator
- 初期化されるツリーのイテレータ.
関数 cvPrevTreeNode は現在対象となっているノードを返し,その後イテレータを更新する(一つ前のノードに移動させる). つまり,この関数の動作は,通常のCのポインタでの *p-- 表現,あるいはC++のコレクションイテレータとほぼ同じである. これ以上のノードがない場合,関数はNULLを返す.
TreeToNodeSeq
すべてのノードへのポインタを一つのシーケンスに集める
CvSeq* cvTreeToNodeSeq( const void* first, int header_size, CvMemStorage* storage );
- first
- ツリーの先頭ノード.
- header_size
- 作成したシーケンスのヘッダサイズ(sizeof(CvSeq) が用いられることが多い).
- storage
- シーケンスのためのコンテナ.
関数 cvTreeToNodeSeq は,ノード first から到達可能なすべてのノードへのポインタを一つのシーケンスにまとめる. ポインタは深さ優先順に順次書き込まれる.
InsertNodeIntoTree
ツリーに新しいノードを追加する
void cvInsertNodeIntoTree( void* node, void* parent, void* frame );
- node
- 挿入されるノード.
- parent
- ツリー内に既に存在している親ノード.
- frame
- トップレベルノード.parent と frame が同じである場合, nodeのv_prevフィールドには,parent ではなく,NULLがセットされる.
関数 cvInsertNodeIntoTree は,ツリーに別のノードを追加する. この関数はメモリの領域確保を行わず,単にツリーノードのリンクを変更するだけである.
RemoveNodeFromTree
ツリーからノードを削除する
void cvRemoveNodeFromTree( void* node, void* frame );
- node
- 削除されるノード.
- frame
- トップレベルノード.node->v_prev = NULL かつ node->h_prev = NULL (つまり,node が frameの最初の子ノードである)である場合, frame->v_next は node->h_next にセットされる (つまり,最初の子ノードかframeが変更される).
関数 cvRemoveNodeFromTree は,ツリーからノードを削除する. この関数はメモリの領域解放を行わず,単にツリーノードのリンクを変更するだけである.