FineKernelToolKit 4.2.13
|
オイラー操作用クラス [詳解]
#include <CLI/FK_CLI/include/Operation_CLI.h>
公開メンバ関数 | |
オイラー操作メソッド | |
fk_Vertex ^ | MakeVertex (fk_Vector^ P) |
頂点生成メソッド | |
bool | DeleteVertex (fk_Vertex^ V) |
頂点削除メソッド | |
bool | MoveVertex (fk_Vertex^ V, fk_Vector^ P) |
頂点移動メソッド | |
fk_Edge ^ | MakeEdge (fk_Vertex^ V_1, fk_Vertex^ V_2, fk_Half^ H_11, fk_Half^ H_12, fk_Half^ H_21, fk_Half^ H_22) |
稜線生成メソッド1 | |
fk_Edge ^ | MakeEdge (fk_Vertex^ V_1, fk_Vertex^ V_2) |
稜線生成メソッド2 | |
bool | DeleteEdge (fk_Edge^ E) |
稜線削除メソッド | |
fk_Loop ^ | MakeLoop (fk_Half ^ H) |
ループ生成メソッド | |
bool | DeleteLoop (fk_Loop^ L) |
ループ削除メソッド | |
fk_Edge ^ | SeparateLoop (fk_Half^ H1, fk_Half^ H2) |
ループ分割メソッド | |
bool | UniteLoop (fk_Edge^ E) |
ループ結合メソッド | |
fk_Vertex ^ | SeparateEdge (fk_Edge^ E) |
稜線分離メソッド | |
bool | UniteEdge (fk_Vertex^ V) |
稜線結合メソッド | |
void | NegateBody (void) |
形状反転メソッド | |
履歴操作メソッド | |
void | SetHistoryMark (void) |
履歴マーク設定メソッド | |
bool | UndoHistory (void) |
UNDO 操作実行メソッド | |
bool | RedoHistory (void) |
REDO 操作実行メソッド | |
![]() | |
bool | CheckDB (void) |
データベース設定チェックメソッド | |
bool | CheckTopology (void) |
位相状況チェックメソッド | |
bool | ExistVertex (fk_Vertex^ vertex) |
頂点位相要素存在判定メソッド1 | |
bool | ExistVertex (int ID) |
頂点位相要素存在判定メソッド2 | |
bool | ExistHalf (fk_Half^ half) |
半稜線位相要素存在判定メソッド1 | |
bool | ExistHalf (int ID) |
半稜線位相要素存在判定メソッド2 | |
bool | ExistEdge (fk_Edge^ edge) |
稜線位相要素存在判定メソッド1 | |
bool | ExistEdge (int ID) |
稜線位相要素存在判定メソッド2 | |
bool | ExistLoop (fk_Loop^ loop) |
ループ位相要素存在判定メソッド1 | |
bool | ExistLoop (int ID) |
ループ位相要素存在判定メソッド2 | |
fk_Vertex ^ | GetVData (int ID) |
頂点位相要素参照メソッド | |
fk_Half ^ | GetHData (int ID) |
半稜線位相要素参照メソッド | |
fk_Edge ^ | GetEData (int ID) |
稜線位相要素参照メソッド | |
fk_Loop ^ | GetLData (int ID) |
ループ位相要素参照メソッド | |
fk_Vertex ^ | GetNextV (fk_Vertex^ vertex) |
頂点位相要素逐次参照メソッド | |
fk_Half ^ | GetNextH (fk_Half^ half) |
半稜線位相要素逐次参照メソッド | |
fk_Edge ^ | GetNextE (fk_Edge^ edge) |
稜線位相要素逐次参照メソッド | |
fk_Loop ^ | GetNextL (fk_Loop^ loop) |
ループ位相要素逐次参照メソッド | |
fk_Vertex ^ | GetLastV (void) |
頂点位相最終要素参照メソッド | |
fk_Half ^ | GetLastH (void) |
半稜線位相最終要素参照メソッド | |
fk_Edge ^ | GetLastE (void) |
稜線位相最終要素参照メソッド | |
fk_Loop ^ | GetLastL (void) |
ループ位相最終要素参照メソッド | |
cli::array< fk_Vertex^> ^ | GetVertexArray (void) |
頂点コンテナ取得メソッド | |
cli::array< fk_Half^> ^ | GetHalfArray (void) |
半稜線コンテナ取得メソッド | |
cli::array< fk_Edge^> ^ | GetEdgeArray (void) |
稜線コンテナ取得メソッド | |
cli::array< fk_Loop^> ^ | GetLoopArray (void) |
ループコンテナ取得メソッド | |
![]() | |
fk_Half ^ | GetOneHOnV (fk_Vertex^ V) |
頂点接続半稜線参照メソッド | |
fk_Edge ^ | GetOneEOnV (fk_Vertex^ V) |
頂点接続稜線参照メソッド | |
fk_Vertex ^ | GetOneNeighborVOnV (fk_Vertex^ V) |
隣接頂点参照メソッド | |
cli::array< fk_Half^> ^ | GetAllHOnV (fk_Vertex^ V) |
頂点接続全半稜線参照メソッド | |
cli::array< fk_Edge^> ^ | GetAllEOnV (fk_Vertex^ V) |
頂点接続全稜線参照メソッド | |
cli::array< fk_Loop^> ^ | GetAllLOnV (fk_Vertex^ V) |
頂点接続全ループ参照メソッド | |
int | GetENumOnV (fk_Vertex^ V) |
頂点接続稜線数参照メソッド | |
cli::array< fk_Vertex^> ^ | GetAllNeighborVOnV (fk_Vertex^ V) |
全隣接頂点参照メソッド | |
cli::array< fk_Edge^> ^ | GetEOnVV (fk_Vertex^ V1, fk_Vertex^ V2) |
頂点間稜線参照メソッド | |
fk_Loop ^ | GetOneLOnV (fk_Vertex^ V) |
頂点接続ループ参照メソッド | |
fk_Vertex ^ | GetVOnH (fk_Half^ H) |
半稜線接続頂点参照メソッド | |
fk_Half ^ | GetMateHOnH (fk_Half^ H) |
対半稜線参照メソッド | |
fk_Edge ^ | GetParentEOnH (fk_Half^ H) |
親稜線参照メソッド | |
fk_Loop ^ | GetParentLOnH (fk_Half^ H) |
親ループ参照メソッド | |
fk_Vertex ^ | GetRightVOnE (fk_Edge^ E) |
右側頂点参照メソッド | |
fk_Vertex ^ | GetLeftVOnE (fk_Edge^ E) |
左側頂点参照メソッド | |
fk_Half ^ | GetRightHOnE (fk_Edge^ E) |
右側半稜線参照メソッド | |
fk_Half ^ | GetLeftHOnE (fk_Edge^ E) |
左側半稜線参照メソッド | |
fk_Loop ^ | GetRightLOnE (fk_Edge^ E) |
右側ループ参照メソッド | |
fk_Loop ^ | GetLeftLOnE (fk_Edge^ E) |
左側ループ参照メソッド | |
fk_EdgeStatus | GetEdgeStatus (fk_Edge^ E) |
稜線位相状態参照メソッド | |
fk_Vertex ^ | GetOneVOnL (fk_Loop^ L) |
ループ所属頂点参照メソッド | |
fk_Half ^ | GetOneHOnL (fk_Loop^ L) |
ループ所属半稜線参照メソッド | |
fk_Edge ^ | GetOneEOnL (fk_Loop^ L) |
ループ所属稜線参照メソッド | |
cli::array< fk_Vertex^> ^ | GetAllVOnL (fk_Loop^ L) |
ループ所属全頂点参照メソッド | |
cli::array< fk_Half^> ^ | GetAllHOnL (fk_Loop^ L) |
ループ所属全半稜線参照メソッド | |
cli::array< fk_Edge^> ^ | GetAllEOnL (fk_Loop^ L) |
ループ所属全稜線参照メソッド | |
fk_Loop ^ | GetOneNeighborLOnL (fk_Loop^ L) |
隣接ループ参照メソッド | |
fk_Loop ^ | GetNeighborLOnLH (fk_Loop^ L, fk_Half^ H) |
半稜線条件付き隣接ループ参照メソッド | |
int | GetVNumOnL (fk_Loop^ L) |
ループ上頂点数参照メソッド | |
fk_Loop ^ | GetNeighborLOnLE (fk_Loop^ L, fk_Edge^ E) |
稜線条件付き隣接ループ参照メソッド | |
cli::array< fk_Loop^> ^ | GetAllNeighborLOnL (fk_Loop^ L) |
全隣接ループ参照メソッド | |
![]() | |
void | SetShaderAttribute (String^ name, int dim, IEnumerable< int >^ array) |
シェーダー内 attribute 変数設定メソッド1 | |
void | SetShaderAttribute (String^ name, int dim, IEnumerable< float >^ array) |
シェーダー内 attribute 変数設定メソッド2 | |
void | SetShaderAttribute (String^ name, int dim, IEnumerable< double >^ array) |
シェーダー内 attribute 変数設定メソッド3 | |
void | SetShaderAttribute (String^ name, int dim, IEnumerable< fk_Vector^>^ array) |
シェーダー内 attribute 変数設定メソッド4 | |
void | SetShaderAttribute (String^ name, int dim, IEnumerable< fk_TexCoord^>^ array) |
シェーダー内 attribute 変数設定メソッド5 | |
void | SetShaderAttribute (String^ name, int dim, IEnumerable< fk_HVector^>^ array) |
シェーダー内 attribute 変数設定メソッド6 | |
![]() | |
bool | SetAttrII (int key, int value) |
キーが int 型、値が int 型である属性設定メソッド | |
bool | SetAttrID (int key, double value) |
キーが int 型、値が double 型である属性設定メソッド | |
bool | SetAttrIS (int key, String^ value) |
キーが int 型、値が String 型である属性設定メソッド | |
bool | SetAttrSI (String^ key, int value) |
キーが String 型、値が int 型である属性設定メソッド | |
bool | SetAttrSD (String^ key, double value) |
キーが String 型、値が double 型である属性設定メソッド | |
bool | SetAttrSS (String ^ key, String^ value) |
キーが String 型、値が String 型である属性設定メソッド | |
int | GetAttrII (int key) |
キーが int 型、値が int 型である属性参照メソッド | |
double | GetAttrID (int key) |
キーが int 型、値が double 型である属性参照メソッド | |
String ^ | GetAttrIS (int key) |
キーが int 型、値が String 型である属性参照メソッド | |
int | GetAttrSI (String^ key) |
キーが String 型、値が int 型である属性参照メソッド | |
double | GetAttrSD (String^ key) |
キーが String 型、値が double 型である属性参照メソッド | |
String ^ | GetAttrSS (String^ key) |
キーが String 型、値が String 型である属性参照メソッド | |
bool | ExistAttrII (int key) |
キーが int 型、値が int 型である属性存在参照メソッド | |
bool | ExistAttrID (int key) |
キーが int 型、値が double 型である属性存在参照メソッド | |
bool | ExistAttrIS (int key) |
キーが int 型、値が String 型である属性存在参照メソッド | |
bool | ExistAttrSI (String^ key) |
キーが String 型、値が int 型である属性存在参照メソッド | |
bool | ExistAttrSD (String^ key) |
キーが String 型、値が double 型である属性存在参照メソッド | |
bool | ExistAttrSS (String^ key) |
キーが String 型、値が String 型である属性存在参照メソッド | |
bool | DeleteAttrII (int key) |
キーが int 型、値が int 型である属性消去メソッド | |
bool | DeleteAttrID (int key) |
キーが int 型、値が double 型である属性消去メソッド | |
bool | DeleteAttrIS (int key) |
キーが int 型、値が String 型である属性消去メソッド | |
bool | DeleteAttrSI (String^ key) |
キーが String 型、値が int 型である属性消去メソッド | |
bool | DeleteAttrSD (String^ key) |
キーが String 型、値が double 型である属性消去メソッド | |
bool | DeleteAttrSS (String^ key) |
キーが String 型、値が String 型である属性消去メソッド | |
プロパティ | |
bool | HistoryMode [get, set] |
履歴保存モードプロパティ | |
bool | TesselateMode [get, set] |
形状全体テセレーションプロパティ | |
![]() | |
int | VNum [get] |
頂点数プロパティ | |
int | HNum [get] |
半稜線数プロパティ | |
int | ENum [get] |
稜線数プロパティ | |
int | LNum [get] |
ループ数プロパティ | |
![]() | |
fk_RealShapeType^ | RealShapeType [get] |
形状データ構造プロパティ | |
オイラー操作用クラス
このクラスは、 fk_Solid クラスのインスタンスにおいて、 位相操作を含む様々な変形に関する基本的な機能を提供します。 fk_Solid の位相についての詳細は、 ユーザーズマニュアルの「形状に対する高度な操作」という章を参照して下さい。
境界表現によるソリッドモデルでは、 数種類の基本的な操作によって変形処理を実現します。 これを「オイラー操作」と呼び、 fk_Solid では 12 種類のオイラー操作が存在します。 どのような複雑な変形処理であっても、 これらのオイラー操作のみ合わせによって実現しています。 より高機能な形状操作機能については、 fk_Modify クラスの各機能を参照して下さい。
オイラー操作のもう一つの特徴は、 任意の操作について必ず「逆操作」が存在するということです。 これは、どのような変形処理についても、 元の形状に戻すための操作が必ず存在することを保障するということです。 このことにより、 fk_Solid では回数無制限の履歴操作を実現しています。 履歴操作については UndoHistory(), RedoHistory() を参照して下さい。
なお、本クラスの解説は独自の用語を用います。定義を以下に述べます。
頂点生成メソッド
任意の位置に新たに頂点位相を生成します。 既にその位置に頂点が存在していたとしても、同じ場所に生成します。
なお、この操作の逆操作は DeleteVertex() メソッドとなります。
[in] | P | 新規頂点の位置ベクトル |
bool FK_CLI::fk_Operation::DeleteVertex | ( | fk_Vertex^ | V | ) |
頂点削除メソッド
独立頂点を削除します。 頂点が接続頂点であった場合や、 形状中に存在していなかった場合は変形操作を行いません。
なお、この操作の逆操作は MakeVertex() メソッドとなります。
[in] | V | 頂点位相インスタンス |
頂点移動メソッド
任意頂点を指定した位置に移動します。 頂点は独立頂点であっても接続頂点であっても構いません。 形状中に存在していなかった場合は変形操作を行いません。
この操作の逆操作はこのメソッド自身となります。
[in] | V | 頂点位相インスタンス |
[in] | P | 移動先の位置ベクトル |
fk_Edge ^ FK_CLI::fk_Operation::MakeEdge | ( | fk_Vertex^ | V_1, |
fk_Vertex^ | V_2, | ||
fk_Half^ | H_11, | ||
fk_Half^ | H_12, | ||
fk_Half^ | H_21, | ||
fk_Half^ | H_22 | ||
) |
稜線生成メソッド1
稜線を新たに生成します。 本メソッドは、新稜線の端点となる頂点 V1, V2 の状態によって、 以下の3通りの処理を行います。
なお、この操作の逆操作は DeleteEdge() メソッドとなります。
[in] | V_1 | 新稜線の端点位相インスタンス |
[in] | V_2 | 新稜線の端点位相インスタンス |
[in] | H_11 | 半稜線位相インスタンス。詳細は上記参照のこと。 |
[in] | H_12 | 半稜線位相インスタンス。詳細は上記参照のこと。 |
[in] | H_21 | 半稜線位相インスタンス。詳細は上記参照のこと。 |
[in] | H_22 | 半稜線位相インスタンス。詳細は上記参照のこと。 |
稜線生成メソッド2
稜線を新たに生成します。 本メソッドは、新稜線の端点となる頂点 V1, V2 が共に独立頂点の場合のみ利用することができます。 なお、この操作の逆操作は DeleteEdge() メソッドとなります。
[in] | V_1 | 新稜線の端点位相インスタンス |
[in] | V_2 | 新稜線の端点位相インスタンス |
bool FK_CLI::fk_Operation::DeleteEdge | ( | fk_Edge^ | E | ) |
稜線削除メソッド
未定義稜線を削除します。 稜線が定義稜線であった場合や、 形状中に存在していなかった場合は変形操作を行いません。
なお、この操作の逆操作は makeEdge() メソッドとなります。
[in] | E | 稜線位相インスタンス |
ループ生成メソッド
ループを新たに生成します。 引数に与えられる H が未定義半稜線である場合、 H が属する半稜線列の親ループとして新規ループが生成され、 それまで空洞であった場所に面が貼られます。 H が定義半稜線である場合は、生成に失敗することになります。
なお、この操作の逆操作は DeleteLoop() メソッドとなります。
[in] | H | 未定義半稜線位相インスタンス |
bool FK_CLI::fk_Operation::DeleteLoop | ( | fk_Loop^ | L | ) |
ループ削除メソッド
ループを削除します。 成功した場合、存在していた面がなくなり空洞状態となります。 また、削除したループを親ループとして持っていた半稜線は、 全て未定義半稜線となります。
なお、この操作の逆操作は MakeLoop() メソッドとなります。
[in] | L | ループ位相インスタンス |
ループ分割メソッド
ループを分割します。 引数の H1 と H2 は同じループに属している必要があります。 分割の際に生成される稜線の端点は、 H1 の終点にあたる頂点と H2 の始点にあたる頂点となります。 始点した端点の間に既に稜線が存在していた場合であっても、 分割処理は行われます。 (その場合は、片方の面が縮退することになります。) 分割に成功した場合、H1 と H2 は新規ループ側に属することになりますので、 新規ループの位相インスタンスを得たい場合は H1 や H2 の親ループを参照して下さい。
なお、この操作の逆操作は UniteLoop() メソッドとなります。
[in] | H1 | 半稜線位相インスタンス |
[in] | H2 | 半稜線位相インスタンス |
bool FK_CLI::fk_Operation::UniteLoop | ( | fk_Edge^ | E | ) |
ループ結合メソッド
両側にループを保持する稜線 E を削除し、 両側のループを結合します。 E が両側にループを持つ稜線ではない場合は、 失敗として扱われ変形操作は行われません。
なお、この操作の逆操作は SeparateLoop() メソッドとなります。
[in] | E | 稜線位相インスタンス |
稜線分離メソッド
任意稜線を分割し、新たな頂点を稜線の両端点の中点位置に生成します。
なお、この操作の逆操作は UniteEdge() メソッドとなります。
[in] | E | 稜線位相インスタンス |
bool FK_CLI::fk_Operation::UniteEdge | ( | fk_Vertex^ | V | ) |
稜線結合メソッド
2本の任意稜線を 1 本に結合します。 結合する稜線の間にある頂点位相 V を引数として入力します。 成功した場合は、V は削除されます。 V に接続している稜線が 2 本でなかった場合は失敗となり、形状操作は行われません。
なお、この操作の逆操作は SeparateEdge() メソッドとなります。
[in] | V | 頂点位相インスタンス |
void FK_CLI::fk_Operation::NegateBody | ( | void | ) |
形状反転メソッド
形状全体の表裏を反転します。 内部的には、全ての稜線において半稜線の左右を入れ替えるという処理を行います。 この処理により、位相関係は以下のような状況となります。
この操作の逆操作はこのメソッド自身となります。
void FK_CLI::fk_Operation::SetHistoryMark | ( | void | ) |
履歴マーク設定メソッド
履歴操作を行う場合は、「マーク」というものを設定する必要があります。 このマークとは、形状の状態の「スナップショット」を保管するもので、 UNDO 操作や REDO 操作を行った際にはマークを行った時点まで戻ります。
UNDO 操作は UndoHistory() メソッドを、 REDO 操作は RedoHistory() メソッドを用います。
bool FK_CLI::fk_Operation::UndoHistory | ( | void | ) |
UNDO 操作実行メソッド
形状を、前に SetHistoryMark() メソッドによってマークした状態まで戻します。 複数回呼び出した場合は、マークした順番を逆に辿って戻していきます。 これを「UNDO 操作」と呼びます。 例えば、形状の初期状態を A、変形を進めてマークした状態を順番に B、C、D とします。これを以下のように表記します。 アスタリスクは現時点での形状を意味します。
D の状態の形状にたいし、UNDO 操作を行うと形状は C、B、A と 順番に戻っていきます。
マークが以前にない状態で UNDO 操作を行った場合は、 履歴保存モードを有効にした時点まで戻ります。
戻した状態の形状を、改めて先の段階に戻す操作を「REDO 操作」と言います。 前述した例で、説明すると、D から一端 A まで戻した形状に対し、 REDO 操作を行うと B、C、D と移っていくということです。図にすると、
となっていくことを意味します。
ただし、UNDO 操作で戻した形状に対し、 REDO 操作以外の形状変形操作を行った場合、 先の履歴部分については破棄されてしまいます。 前述の例で説明すると、D の状態を一端 B にまで UNDO 操作で戻します。 図にすると、
この D の状態から、
この B の状態になるということです。ここで B の形状に変形操作を行うと、 C や D に至るための履歴情報が破棄されます。
ただし、図にあるように B より前の履歴情報については保持されます。
bool FK_CLI::fk_Operation::RedoHistory | ( | void | ) |
REDO 操作実行メソッド
UNDO 操作によって以前の状態に戻した形状に対し、 その後にマークした状態まで形状を戻します。 UNDO 操作や REDO 操作に関しての詳細は、 UndoHistory() メソッドの解説を参照して下さい。
|
getset |
履歴保存モードプロパティ
履歴保存モードの有無効の参照・設定を行います。 true の場合、履歴保存モードを有効、false の場合は無効となります。 デフォルトでは「無効」となっており、 変形操作による履歴は保存されません。 このプロパティを true に設定した時点から保存されます。 従って、設定を有効にする前の履歴は一切保存されないということに注意して下さい。
また、モードが有効となっている状態から無効に設定しなおしたとき、 有効時に保存されていた履歴は全て破棄されます。
|
getset |
形状全体テセレーションプロパティ
形状中の全てのループに対し、テセレーション有無効の参照・設定を行います。 true の場合、全てのループのテセレーションを有効となります。 false の場合は無効となります。
このプロパティを false から true にした場合、 変更前に行ったループ個別の設定は全て破棄されます。 テセレーションについての詳細は、 fk_Loop::TesselateMode プロパティの解説を参照して下さい。