# クラス fk_Operation

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

fk_Operationに対する継承グラフ
[凡例]
fk_Operationのコラボレーション図
[凡例]

すべてのメンバ一覧

## Public メソッド
| fk_Operation (fk_DataBase *=(fk_DataBase *) NULL)
| コンストラクタ
| ~fk_Operation ()
| デストラクタ
オイラー操作関数
fk_Vertex * | makeVertex (const 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 *) 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_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 | setHistoryMode (bool mode)
| 履歴保存モード設定関数
bool | getHistoryMode (void)
| 履歴保存モード参照関数
void | setHistoryMark (void)
| 履歴マーク設定関数
bool | undoHistory (void)
| UNDO 操作実行関数.
bool | redoHistory (void)
| REDO 操作実行関数.
テセレーション制御関数
void | setTesselateMode (bool mode)
| 形状全体テセレーション設定関数
bool | getTesselateMode (void)
| 形状全体テセレーション状態参照関数

## 説明

オイラー操作用クラス

このクラスは、 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` | ) |

コンストラクタ

fk_Operation::~fk_Operation | ( |  | ) |

デストラクタ

## 関数

fk_Vertex* fk_Operation::makeVertex | ( | const fk_Vector | P | ) |

頂点生成関数

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

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

makeVertex と deleteVertex

引数:

  `[in]` | P | 新規頂点の位置ベクトル

戻り値:
  新規頂点位相インスタンス

bool fk_Operation::deleteVertex | ( | fk_Vertex * | V | ) |

頂点削除関数

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

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

makeVertex と deleteVertex

引数:

  `[in]` | V | 頂点位相インスタンス

戻り値:
  削除に成功すれば true を、失敗すれば false を返します。

bool fk_Operation::moveVertex | ( | fk_Vertex * | V,
|  | fk_Vector | P |
| ) |  |  |

頂点移動関数

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

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

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() 関数となります。

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() 関数となります。

makeEdge と deleteEdge

引数:

  `[in]` | E | 稜線位相インスタンス

戻り値:
  削除に成功すれば true を、失敗すれば false を返します。

fk_Loop* fk_Operation::makeLoop | ( | fk_Half * | H | ) |

ループ生成関数

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

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

makeLoop と deleteLoop

引数:

  `[in]` | H | 未定義半稜線位相インスタンス

戻り値:
  生成に成功した場合、そのループ位相インスタンスを返します。 失敗した場合は NULL を返します。

bool fk_Operation::deleteLoop | ( | fk_Loop * | L | ) |

ループ削除関数

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

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

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() 関数となります。

separateLoop と uniteLoop

引数:

  `[in]` | H1 | 半稜線位相インスタンス
  `[in]` | H2 | 半稜線位相インスタンス

戻り値:
  成功した場合、新規稜線の位相インスタンスを返します。 失敗した場合は NULL を返します。

bool fk_Operation::uniteLoop | ( | fk_Edge * | E | ) |

ループ結合関数

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

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

separateLoop と uniteLoop

引数:

  `[in]` | E | 稜線位相インスタンス

戻り値:
  成功すれば true を、失敗すれば false を返します。

fk_Vertex* fk_Operation::separateEdge | ( | fk_Edge * | E | ) |

稜線分離関数

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

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

separateEdge と uniteEdge

引数:

  `[in]` | E | 稜線位相インスタンス

戻り値:
  成功すれば新規に生成された頂点位相インスタンスを返します。 失敗した場合は NULL を返します。

bool fk_Operation::uniteEdge | ( | fk_Vertex * | V | ) |

稜線結合関数

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

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

separateEdge と uniteEdge

引数:

  `[in]` | V | 頂点位相インスタンス

戻り値:
  成功すれば true を、失敗すれば false を返します。

void fk_Operation::negateBody | ( | void |  | ) |

形状反転関数

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

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

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

void fk_Operation::setHistoryMode | ( | bool | mode | ) |

履歴保存モード設定関数

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

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

引数:

  `[in]` | mode | true の場合、履歴保存モードを有効とします。 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]` | mode | true の場合、全てのループのテセレーションを有効とします。 false の場合は無効とします。

参照:
  fk_Loop::setTesselateMode()

bool fk_Operation::getTesselateMode | ( | void |  | ) |

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

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

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