02.節でもファイルのオープン・クローズの簡単なテストを行いましたが、ここでは、3DCGのフォーマットを決定してその情報をファイルから読み込めるようにします。
ファイルからデータを読み込んでメモリ上に展開するまでのところは、09節までのプログラムとは直接関係しないので、本節のプログラムはここで初めから書き起こします。
3DCGモデルのファイル読込は、将来的にはライブラリにして09.節の本体プログラムに統合するという見通しにしておきます。
このためには、初めからファイルを分割してプログラミングするのがよいことになります。
10.01.節ではファイルの中にまで踏み込まないので、モデルファイルは存在さえしていれば内容は空でも構いません。
【プログラム10-01】
演習
10-01-ex1: エラートラップ
本節のプログラムにおいて、エラートラップと呼べる行を示し、トラップするエラーと、その対策を示しなさい。複数ある場合は全て示すこと。
10-01-ex2: エラートラップの確認
10-01-ex1のエラートラップが実際に発生することを確認しなさい。
10-01-ex3: define文の実際
Cコンパイラにおいて、#define文で導入された文字列がどのようにメモリ上に展開されるか、eclipseを用いて確認してみなさい。
3DCGモデルをテキストファイルで表現することを考えます。
1行で三角形パッチ1つを表現します。
X0 Y0 Z0 X1 Y1 Z1 X2 Y2 Z2 R G B |
なお、本授業では、単純化のため、三角形パッチ以外のCGプリミティブは使用しません。
構造体の利用
上記のデータ構造に合わせて、ic2PATCH構造体を用意します。
ic2PATCH構造体はic2POINT構造体とic2COLOR構造体から構成されます。
また、リンクトリストで複数のパッチを一括管理するために、ポインタを含んでいます。
ヘッダファイル (ic2-ModelHeaders.h)
ライブラリ的利用をするために、共通部分をヘッダファイル化します。
【プログラム10-02】
演習
10-02-ex1: リンクトリスト(先頭挿入)
ic2_InsertPATCH()関数の(5)のプログラムソースについて、各変数とアドレスとの関係を図で示しながら、当該部分が新しいパッチをリストの先頭に挿入できることを説明しなさい。
10-02-ex2: リンクトリスト(末尾挿入)
ic2_InsertPATCH()関数の(5)のプログラムソースについて、新しいパッチがリンクトリストの最後尾に挿入されるように改造しなさい。
10-02-ex3: コスト比較
10-02-ex1 と 10-02-ex2 の2つのアルゴリズムは、計算コストとしてどちらが少ないか理由を挙げて説明しなさい。また、その計算コストの差は本節のプログラム記述において考慮すべき価値があるかどうかについても考察しなさい。
10-02-ex4: ソースコード確認
上記ファイル内の構文の制約[1] - [5]がプログラムソースでどのように実現されているか、それぞれ当該部分を示しながら説明しなさい。
10-02-ex5: エラートラップ
10-02-ReadModel.c 内で記述されている各関数について、エラートラップの内容とその対策がどのように行われているかについて、全て書き出しなさい。
10-02-ex6: エラー時の続行
モデルファイルが途中で壊れていても、途中までは読み込んで実行を続けるよう 10-02-ReadModel.c を改良しなさい。改良方法についてはソース内のコメントで解説すること。
10-02-ex7: 法線ベクトル
三角形ポリゴンごとに、単位法線ベクトルを求める式を書きなさい。式表現には上で導入したデータフォーマットに出てくる記号を用いること。
(ベクトルの外積を使って立式するのが一般的でしょう)