FineKernelToolKit  2.9.0
 全て クラス ネームスペース ファイル 関数 変数 型定義 列挙型 列挙型の値 フレンド マクロ定義 ページ
Public メソッド | すべてのメンバ一覧
クラス fk_Operation

オイラー操作用クラス [詳細]

+ fk_Operationに対する継承グラフ
+ fk_Operationのコラボレーション図

Public メソッド

 fk_Operation (fk_DataBase *=(fk_DataBase *) NULL)
 コンストラクタ [詳細]
 
virtual ~fk_Operation ()
 デストラクタ [詳細]
 
オイラー操作関数
fk_VertexmakeVertex (const fk_Vector P)
 頂点生成関数 [詳細]
 
bool deleteVertex (fk_Vertex *V)
 頂点削除関数 [詳細]
 
bool moveVertex (fk_Vertex *V, fk_Vector P)
 頂点移動関数 [詳細]
 
fk_EdgemakeEdge (fk_Vertex *V_1, fk_Vertex *V_2, fk_Half *H_11=(fk_Half *) NULL, fk_Half *H_12=(fk_Half *) NULL, fk_Half *H_21=(fk_Half *) NULL, fk_Half *H_22=(fk_Half *) NULL)
 稜線生成関数 [詳細]
 
bool deleteEdge (fk_Edge *E)
 稜線削除関数 [詳細]
 
fk_LoopmakeLoop (fk_Half *H)
 ループ生成関数 [詳細]
 
bool deleteLoop (fk_Loop *L)
 ループ削除関数 [詳細]
 
fk_EdgeseparateLoop (fk_Half *H1, fk_Half *H2)
 ループ分割関数 [詳細]
 
bool uniteLoop (fk_Edge *E)
 ループ結合関数 [詳細]
 
fk_VertexseparateEdge (fk_Edge *E)
 稜線分離関数 [詳細]
 
bool uniteEdge (fk_Vertex *V)
 稜線結合関数 [詳細]
 
void negateBody (void)
 形状反転関数 [詳細]
 
履歴操作関数
void setHistoryMode (bool mode)
 履歴保存モード設定関数 [詳細]
 
bool getHistoryMode (void)
 履歴保存モード参照関数 [詳細]
 
void setHistoryMark (void)
 履歴マーク設定関数 [詳細]
 
bool undoHistory (void)
 UNDO 操作実行関数 [詳細]
 
bool redoHistory (void)
 REDO 操作実行関数 [詳細]
 
テセレーション制御関数
void setTesselateMode (bool mode)
 形状全体テセレーション設定関数 [詳細]
 
bool getTesselateMode (void)
 形状全体テセレーション状態参照関数 [詳細]
 
- Public メソッド inherited from fk_MassProperty
 fk_MassProperty (void)
 
- Public メソッド inherited from fk_DataAccess
 fk_DataAccess (void)
 コンストラクタ [詳細]
 
virtual ~fk_DataAccess ()
 デストラクタ [詳細]
 
bool checkDB (void) const
 データベース設定チェック関数 [詳細]
 
bool checkTopology (void)
 位相状況チェック関数 [詳細]
 
void printTopology (void)
 位相状況出力関数 [詳細]
 
bool existVertex (fk_Vertex *vertex) const
 頂点位相要素存在判定関数1 [詳細]
 
bool existVertex (int ID) const
 頂点位相要素存在判定関数2 [詳細]
 
bool existHalf (fk_Half *half) const
 半稜線位相要素存在判定関数1 [詳細]
 
bool existHalf (int ID) const
 半稜線位相要素存在判定関数2 [詳細]
 
bool existEdge (fk_Edge *edge) const
 稜線位相要素存在判定関数1 [詳細]
 
bool existEdge (int ID) const
 稜線位相要素存在判定関数2 [詳細]
 
bool existLoop (fk_Loop *loop) const
 ループ位相要素存在判定関数1 [詳細]
 
bool existLoop (int ID) const
 ループ位相要素存在判定関数2 [詳細]
 
fk_VertexgetVData (int ID) const
 頂点位相要素参照関数 [詳細]
 
fk_HalfgetHData (int ID) const
 半稜線位相要素参照関数 [詳細]
 
fk_EdgegetEData (int ID) const
 稜線位相要素参照関数 [詳細]
 
fk_LoopgetLData (int ID) const
 ループ位相要素参照関数 [詳細]
 
fk_VertexgetNextV (fk_Vertex *vertex) const
 頂点位相要素逐次参照関数 [詳細]
 
fk_HalfgetNextH (fk_Half *half) const
 半稜線位相要素逐次参照関数 [詳細]
 
fk_EdgegetNextE (fk_Edge *edge) const
 稜線位相要素逐次参照関数 [詳細]
 
fk_LoopgetNextL (fk_Loop *loop) const
 ループ位相要素逐次参照関数 [詳細]
 
fk_VertexgetLastV (void) const
 頂点位相最終要素参照関数 [詳細]
 
fk_HalfgetLastH (void) const
 半稜線位相最終要素参照関数 [詳細]
 
fk_EdgegetLastE (void) const
 稜線位相最終要素参照関数 [詳細]
 
fk_LoopgetLastL (void) const
 ループ位相最終要素参照関数 [詳細]
 
int getVNum (void) const
 頂点数参照関数 [詳細]
 
int getHNum (void) const
 半稜線数参照関数 [詳細]
 
int getENum (void) const
 稜線数参照関数 [詳細]
 
int getLNum (void) const
 ループ数参照関数 [詳細]
 
- Public メソッド inherited from fk_ReferenceL3
std::vector< fk_Vertex * > getAllNeighborVOnV (fk_Vertex *V) const
 全隣接頂点参照関数 [詳細]
 
std::vector< fk_Edge * > getEOnVV (fk_Vertex *V1, fk_Vertex *V2) const
 頂点間稜線参照関数 [詳細]
 
fk_LoopgetOneLOnV (fk_Vertex *V) const
 頂点接続ループ参照関数 [詳細]
 
fk_LoopgetNeighborLOnLE (fk_Loop *L, fk_Edge *E) const
 稜線条件付き隣接ループ参照関数 [詳細]
 
std::vector< fk_Loop * > getAllNeighborLOnL (fk_Loop *L) const
 全隣接ループ参照関数 [詳細]
 
- Public メソッド inherited from fk_ReferenceL2
fk_VertexgetOneNeighborVOnV (fk_Vertex *V) const
 隣接頂点参照関数 [詳細]
 
std::vector< fk_Half * > getAllHOnV (fk_Vertex *V) const
 頂点接続全半稜線参照関数 [詳細]
 
std::vector< fk_Edge * > getAllEOnV (fk_Vertex *V) const
 頂点接続全稜線参照関数 [詳細]
 
std::vector< fk_Loop * > getAllLOnV (fk_Vertex *V) const
 頂点接続全ループ参照関数 [詳細]
 
int getENumOnV (fk_Vertex *V) const
 頂点接続稜線数参照関数 [詳細]
 
std::vector< fk_Vertex * > getAllVOnL (fk_Loop *L) const
 ループ所属全頂点参照関数 [詳細]
 
std::vector< fk_Half * > getAllHOnL (fk_Loop *L) const
 ループ所属全半稜線参照関数 [詳細]
 
std::vector< fk_Edge * > getAllEOnL (fk_Loop *L) const
 ループ所属全稜線参照関数 [詳細]
 
fk_LoopgetOneNeighborLOnL (fk_Loop *L) const
 隣接ループ参照関数 [詳細]
 
fk_LoopgetNeighborLOnLH (fk_Loop *L, fk_Half *H) const
 半稜線条件付き隣接ループ参照関数 [詳細]
 
int getVNumOnL (fk_Loop *L) const
 ループ上頂点数参照関数 [詳細]
 
- Public メソッド inherited from fk_ReferenceL1
fk_HalfgetOneHOnV (fk_Vertex *V) const
 頂点接続半稜線参照関数 [詳細]
 
fk_EdgegetOneEOnV (fk_Vertex *V) const
 頂点接続稜線参照関数 [詳細]
 
fk_VertexgetVOnH (fk_Half *H) const
 半稜線接続頂点参照関数 [詳細]
 
fk_HalfgetMateHOnH (fk_Half *H) const
 対半稜線参照関数 [詳細]
 
fk_EdgegetParentEOnH (fk_Half *H) const
 親稜線参照関数 [詳細]
 
fk_LoopgetParentLOnH (fk_Half *H) const
 親ループ参照関数 [詳細]
 
fk_VertexgetRightVOnE (fk_Edge *E) const
 右側頂点参照関数 [詳細]
 
fk_VertexgetLeftVOnE (fk_Edge *E) const
 左側頂点参照関数 [詳細]
 
fk_HalfgetRightHOnE (fk_Edge *E) const
 右側半稜線参照関数 [詳細]
 
fk_HalfgetLeftHOnE (fk_Edge *E) const
 左側半稜線参照関数 [詳細]
 
fk_LoopgetRightLOnE (fk_Edge *E) const
 右側ループ参照関数 [詳細]
 
fk_LoopgetLeftLOnE (fk_Edge *E) const
 左側ループ参照関数 [詳細]
 
fk_EdgeStatus getEdgeStatus (fk_Edge *E) const
 稜線位相状態参照関数 [詳細]
 
fk_VertexgetOneVOnL (fk_Loop *L) const
 ループ所属頂点参照関数 [詳細]
 
fk_HalfgetOneHOnL (fk_Loop *L) const
 ループ所属半稜線参照関数 [詳細]
 
fk_EdgegetOneEOnL (fk_Loop *L) const
 ループ所属稜線参照関数 [詳細]
 

説明

オイラー操作用クラス

このクラスは、 fk_Solid クラスのインスタンスにおいて、 位相操作を含む様々な変形に関する基本的な機能を提供します。 fk_Solid の位相についての詳細は、 ユーザーズマニュアルの「形状に対する高度な操作」という章を参照して下さい。

境界表現によるソリッドモデルでは、 数種類の基本的な操作によって変形処理を実現します。 これを「オイラー操作」と呼び、 fk_Solid では 12 種類のオイラー操作が存在します。 どのような複雑な変形処理であっても、 これらのオイラー操作のみ合わせによって実現しています。 より高機能な形状操作機能については、 fk_Modify クラスの各機能を参照して下さい。

オイラー操作のもう一つの特徴は、 任意の操作について必ず「逆操作」が存在するということです。 これは、どのような変形処理についても、 元の形状に戻すための操作が必ず存在することを保障するということです。 このことにより、 fk_Solid では回数無制限の履歴操作を実現しています。 履歴操作については undoHistory(), redoHistory() を参照して下さい。

なお、本クラスの解説は独自の用語を用います。定義を以下に述べます。

参照
fk_Solid, fk_Modify, fk_DataAccess, fk_ReferenceL1, fk_ReferenceL2, fk_ReferenceL3

コンストラクタとデストラクタ

fk_Operation::fk_Operation ( fk_DataBase *  = (fk_DataBase *) NULL)

コンストラクタ

virtual fk_Operation::~fk_Operation ( )
virtual

デストラクタ

関数

fk_Vertex* fk_Operation::makeVertex ( const fk_Vector  P)

頂点生成関数

任意の位置に新たに頂点位相を生成します。 既にその位置に頂点が存在していたとしても、同じ場所に生成します。

なお、この操作の逆操作は deleteVertex() 関数となります。

Euler01.png
makeVertex と deleteVertex
引数
[in]P新規頂点の位置ベクトル
戻り値
新規頂点位相インスタンス
bool fk_Operation::deleteVertex ( fk_Vertex V)

頂点削除関数

独立頂点を削除します。 頂点が接続頂点であった場合や、 形状中に存在していなかった場合は変形操作を行いません。

なお、この操作の逆操作は makeVertex() 関数となります。

Euler01.png
makeVertex と deleteVertex
引数
[in]V頂点位相インスタンス
戻り値
削除に成功すれば true を、失敗すれば false を返します。
bool fk_Operation::moveVertex ( fk_Vertex V,
fk_Vector  P 
)

頂点移動関数

任意頂点を指定した位置に移動します。 頂点は独立頂点であっても接続頂点であっても構いません。 形状中に存在していなかった場合は変形操作を行いません。

この操作の逆操作はこの関数自身となります。

Euler02.png
moveVertex
引数
[in]V頂点位相インスタンス
[in]P移動先の位置ベクトル
戻り値
移動に成功すれば true を、失敗すれば false を返します。
fk_Edge* fk_Operation::makeEdge ( fk_Vertex V_1,
fk_Vertex V_2,
fk_Half H_11 = (fk_Half *) NULL,
fk_Half H_12 = (fk_Half *) NULL,
fk_Half H_21 = (fk_Half *) NULL,
fk_Half H_22 = (fk_Half *) NULL 
)

稜線生成関数

稜線を新たに生成します。 この関数は、新稜線の端点となる頂点 V1, V2 の状態によって、 以下の3通りの処理を行います。

  1. V_1 と V_2 が共に独立頂点の場合。
    この場合は、H_11, H_12, H_21, H_22 のいずれも NULL を代入します。 引数自体を省略しても構いません。

  2. V_1 が接続頂点で、V_2 が独立頂点の場合。
    新たに生成される稜線の半稜線を H1, H2 とし、 H1 の始点が V_1、H2 の始点が V_2 であるとします。 このとき、H_11 には接続後に H1 の前となる半稜線を代入します。 H_12 には、H2 の後となる半稜線を代入します。 このとき、H_11 および H_12 は未定義半稜線である必要があります。 H_21 と H_22 には NULL を代入します。 H_21 と H_22 の引数は省略しても構いません。

  3. V_1, V_2 のいずれも接続頂点の場合。
    新たに生成される稜線の半稜線を H1, H2 とし、 H1 の始点が V_1、H2 の始点が V_2 であるとします。 このとき、以下のような想定となる半稜線をそれぞれ代入します。
    • H_11 は H1 の前
    • H_12 は H2 の後
    • H_21 は H2 の前
    • H_22 は H1 の後
    上記のいずれの半稜線も未定義稜線でなければなりません。

なお、この操作の逆操作は deleteEdge() 関数となります。

Euler03.png
makeEdge と deleteEdge
引数
[in]V_1新稜線の端点位相インスタンス
[in]V_2新稜線の端点位相インスタンス
[in]H_11半稜線位相インスタンス。詳細は上記参照のこと。
[in]H_12半稜線位相インスタンス。詳細は上記参照のこと。
[in]H_21半稜線位相インスタンス。詳細は上記参照のこと。
[in]H_22半稜線位相インスタンス。詳細は上記参照のこと。
戻り値
新稜線の生成に成功した場合、その位相インスタンスを返します。 失敗した場合は NULL を返します。
bool fk_Operation::deleteEdge ( fk_Edge E)

稜線削除関数

未定義稜線を削除します。 稜線が定義稜線であった場合や、 形状中に存在していなかった場合は変形操作を行いません。

なお、この操作の逆操作は makeEdge() 関数となります。

Euler03.png
makeEdge と deleteEdge
引数
[in]E稜線位相インスタンス
戻り値
削除に成功すれば true を、失敗すれば false を返します。
fk_Loop* fk_Operation::makeLoop ( fk_Half H)

ループ生成関数

ループを新たに生成します。 引数に与えられる H が未定義半稜線である場合、 H が属する半稜線列の親ループとして新規ループが生成され、 それまで空洞であった場所に面が貼られます。 H が定義半稜線である場合は、生成に失敗することになります。

なお、この操作の逆操作は deleteLoop() 関数となります。

Euler04.png
makeLoop と deleteLoop
引数
[in]H未定義半稜線位相インスタンス
戻り値
生成に成功した場合、そのループ位相インスタンスを返します。 失敗した場合は NULL を返します。
bool fk_Operation::deleteLoop ( fk_Loop L)

ループ削除関数

ループを削除します。 成功した場合、存在していた面がなくなり空洞状態となります。 また、削除したループを親ループとして持っていた半稜線は、 全て未定義半稜線となります。

なお、この操作の逆操作は makeLoop() 関数となります。

Euler04.png
makeLoop と deleteLoop
引数
[in]Lループ位相インスタンス
戻り値
成功した場合 true を、失敗した場合 false を返します。
fk_Edge* fk_Operation::separateLoop ( fk_Half H1,
fk_Half H2 
)

ループ分割関数

ループを分割します。 引数の H1 と H2 は同じループに属している必要があります。 分割の際に生成される稜線の端点は、 H1 の終点にあたる頂点と H2 の始点にあたる頂点となります。 始点した端点の間に既に稜線が存在していた場合であっても、 分割処理は行われます。 (その場合は、片方の面が縮退することになります。) 分割に成功した場合、H1 と H2 は新規ループ側に属することになりますので、 新規ループの位相インスタンスを得たい場合は H1 や H2 の親ループを参照して下さい。

なお、この操作の逆操作は uniteLoop() 関数となります。

Euler05.png
separateLoop と uniteLoop
引数
[in]H1半稜線位相インスタンス
[in]H2半稜線位相インスタンス
戻り値
成功した場合、新規稜線の位相インスタンスを返します。 失敗した場合は NULL を返します。
bool fk_Operation::uniteLoop ( fk_Edge E)

ループ結合関数

両側にループを保持する稜線 E を削除し、 両側のループを結合します。 E が両側にループを持つ稜線ではない場合は、 失敗として扱われ変形操作は行われません。

なお、この操作の逆操作は separateLoop() 関数となります。

Euler05.png
separateLoop と uniteLoop
引数
[in]E稜線位相インスタンス
戻り値
成功すれば true を、失敗すれば false を返します。
fk_Vertex* fk_Operation::separateEdge ( fk_Edge E)

稜線分離関数

任意稜線を分割し、新たな頂点を稜線の両端点の中点位置に生成します。

なお、この操作の逆操作は uniteEdge() 関数となります。

Euler06.png
separateEdge と uniteEdge
引数
[in]E稜線位相インスタンス
戻り値
成功すれば新規に生成された頂点位相インスタンスを返します。 失敗した場合は NULL を返します。
bool fk_Operation::uniteEdge ( fk_Vertex V)

稜線結合関数

2本の任意稜線を 1 本に結合します。 結合する稜線の間にある頂点位相 V を引数として入力します。 成功した場合は、V は削除されます。 V に接続している稜線が 2 本でなかった場合は失敗となり、形状操作は行われません。

なお、この操作の逆操作は separateEdge() 関数となります。

Euler06.png
separateEdge と uniteEdge
引数
[in]V頂点位相インスタンス
戻り値
成功すれば true を、失敗すれば false を返します。
void fk_Operation::negateBody ( void  )

形状反転関数

形状全体の表裏を反転します。 内部的には、全ての稜線において半稜線の左右を入れ替えるという処理を行います。 この処理により、位相関係は以下のような状況となります。

  • 関係の変わらないもの
    • 頂点と半稜線の組み合わせ
    • 稜線と半稜線の組み合わせ
    • ループと頂点の組み合わせ
    • ループと稜線の組み合わせ
  • 関係が変化するもの
    • ループと半稜線の組み合わせ
    • 半稜線の接続

この操作の逆操作はこの関数自身となります。

void fk_Operation::setHistoryMode ( bool  mode)

履歴保存モード設定関数

履歴保存モードの有無効を設定します。 デフォルトでは「無効」となっており、 変形操作による履歴は保存されません。 この関数で「有効」に設定した時点から保存されます。 従って、設定を有効にする前の履歴は一切保存されないということに注意して下さい。

また、モードが有効となっている状態から無効に設定しなおしたとき、 有効時に保存されていた履歴は全て破棄されます。

引数
[in]modetrue の場合、履歴保存モードを有効とします。 false の場合は無効とします。
参照
getHistoryMode(), setHistoryMark()
bool fk_Operation::getHistoryMode ( void  )

履歴保存モード参照関数

履歴保存モードの状態を返します。 履歴保存モードについては、 setHistoryMode() の解説を参照して下さい。

戻り値
有効である場合 true を、無効である場合 false を返します。
参照
setHistoryMode()
void fk_Operation::setHistoryMark ( void  )

履歴マーク設定関数

履歴操作を行う場合は、「マーク」というものを設定する必要があります。 このマークとは、形状の状態の「スナップショット」を保管するもので、 UNDO 操作や REDO 操作を行った際にはマークを行った時点まで戻ります。

UNDO 操作は undoHistory() 関数を、 REDO 操作は redoHistory() 関数を用います。

参照
setHistoryMode(), undoHistory(), redoHistory()
bool fk_Operation::undoHistory ( void  )

UNDO 操作実行関数

形状を、前に setHistoryMark() 関数によってマークした状態まで戻します。 複数回呼び出した場合は、マークした順番を逆に辿って戻していきます。 これを「UNDO 操作」と呼びます。 例えば、形状の初期状態を A、変形を進めてマークした状態を順番に B、C、D とします。これを以下のように表記します。 アスタリスクは現時点での形状を意味します。

  • A → B → C → *D

D の状態の形状にたいし、UNDO 操作を行うと形状は C、B、A と 順番に戻っていきます。

  • A → B → C → *D
  • A → B → *C → D
  • A → *B → C → D
  • *A → B → C → D

マークが以前にない状態で UNDO 操作を行った場合は、 履歴保存モードを有効にした時点まで戻ります。

戻した状態の形状を、改めて先の段階に戻す操作を「REDO 操作」と言います。 前述した例で、説明すると、D から一端 A まで戻した形状に対し、 REDO 操作を行うと B、C、D と移っていくということです。図にすると、

  • *A → B → C → D
  • A → *B → C → D
  • A → B → *C → D
  • A → B → C → *D

となっていくことを意味します。

ただし、UNDO 操作で戻した形状に対し、 REDO 操作以外の形状変形操作を行った場合、 先の履歴部分については破棄されてしまいます。 前述の例で説明すると、D の状態を一端 B にまで UNDO 操作で戻します。 図にすると、

  • A → B → C → *D

この D の状態から、

  • A → *B → C → D

この B の状態になるということです。ここで B の形状に変形操作を行うと、 C や D に至るための履歴情報が破棄されます。

  • A → B → *B'

ただし、図にあるように B より前の履歴情報については保持されます。

戻り値
UNDO 操作に成功した場合 true を、失敗した場合 false を返します。
参照
redoHistory()
bool fk_Operation::redoHistory ( void  )

REDO 操作実行関数

UNDO 操作によって以前の状態に戻した形状に対し、 その後にマークした状態まで形状を戻します。 UNDO 操作や REDO 操作に関しての詳細は、 undoHistory() 関数の解説を参照して下さい。

戻り値
REDO 操作に成功した場合 true を、失敗した場合 false を返します。
参照
undoHistory()
void fk_Operation::setTesselateMode ( bool  mode)

形状全体テセレーション設定関数

形状中の全てのループに対し、テセレーションの有無効を設定します。 この関数を呼ぶ前に行ったループ個別の設定は全て破棄されます。 テセレーションについての詳細は、 fk_Loop::setTesselateMode() 関数の解説を参照して下さい。

引数
[in]modetrue の場合、全てのループのテセレーションを有効とします。 false の場合は無効とします。
参照
fk_Loop::setTesselateMode()
bool fk_Operation::getTesselateMode ( void  )

形状全体テセレーション状態参照関数

直近の setTesselateMode() 関数による設定を返します。 これは、 setTesselateMode() によって形状全体の設定がなされた後、 fk_Loop::setTesselateMode() によって個別に有無効を設定されていた場合でも、 個別設定とは無関係です。 例えば、この関数で true が返ってきたとしても、 全てのループでテセレーションが有効となっているとは限りません。

戻り値
直近の setTesselateMode() 関数による設定値を返します。