Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
[go: Go Back, main page]

I'm crazy about
Beads[III]
4/19 記が狂うほど数珠つなぎ[III]





おたより紹介



 こないだの数珠つなぎの話題について、BBSでも意見を下さったREKIさんからメールをいただきました。

ども。REKIです。
数珠つなぎ2見ました。gakuさんもshi3zさんも短時間で大したもんです。
でも、まだ少しだけ意見差し挟む余地があるような気がしたので徹夜仕事の
合間に考えてみました。こんなのどうかと思います。
基本的路線はshi3zさんと同じです。

template< class T > class TList {
private:
    T &body;
    TList *next, *back;
public:
    TList( T &b; ) : body(b) {    //bodyをbで初期化。
        next=NULL, back=NULL;
    }

    AddNext( TList &n; ) {
        next = &n;
        n.back = this;
    }
};

class Body {
    TList list;
public:
    Body( ):list( *this ){    //こういう真似ってできるんでしょうか。エラーは出ないけど。
    }
};

とまあそんなわけです。
メンバーにある参照ってポインタでシミュレートされちゃうんでしょうかね。もしそう
だとしたら、速度面ではあまり意味が無くなってしまいますが、それでも最低限
バグの抑制にはなると思います。

リスト内の本体はnullを許したくないので、参照にすると良いかも知れないと
考えました。
一応コンパイルして若干のチェックはしましたが徹夜明けの頭で考えたので、
なんか間違っている可能性はあるんですけど(笑)。

 うーん、参照はポインタでシミュレート(?)するしかないのでは。というかポインタを文法上厳しくしたのが参照なのでは?(基本的には)と思うのですがどうなんざんしょ。確かに、インライン関数のパラメータ参照とかだとマクロ的に展開できそうですが、よくわかりません。

 あと、ビックリして思わずきいてしまったのが冒頭のコンストラクタの記法。「TList( T &b; ) : body(b)」とするとコンストラクタを実行する前にbodyメンバにパラメータbを代入できるのですね。ごめんなさい。知りませんでした。やはりC++は奥が深いなどといってお茶を濁しておきましょう。

 




多重従属関係の図示

 このシリーズの最初の回に説明したとおり、僕はこのような一連の多重従属関係を、そもそも3Dシステムを設計するときに必要としました。

 Computefan誌の連載「Cで目指せ!びゅんびゅんポリゴン」の熱血最強タナキングでは、シーングラフ(シーンのツリー構造)のリンクと、ポリゴンソート順のリストを全く別個の観点から二重ノードをつくり、実現していました。しかしこのときはあまり深く考えていなかったので、そのままダラダラと実装する結果になっていました。

 まぁしかし、新たに3Dシステムを設計するにあたって、この多重の従属関係をより活用できないかと思ったわけです。

 さて、この三回の連載で、多少のオーバーヘッドに目をつむればなんとかエレガントに記述する方法が判明しました。

 ところで我々は依然として問題を抱えています。これについてはなにも解決されていません。

 なんでしょう?答えは、多重の従属関係を図示するのが極めて難しいことです。

 お便りを下さったのが、REKIさんとgakuさん、いずれも現役バリバリのプログラマの方ですから、ある程度(といってもかなりの)経験を積んだプログラマでないとこの話全体が理解できないのかもしれません。

 初心者に説明するときだけでなく、自分自身が構造の欠点を見つけるためにも、できればこれは図示できた方がいい、いやむしろ図示できなければ駄目だというべきでしょう。

 この概念が極めて特殊なもののように感じられ、教科書にも載っていない原因のひとつは、それが極めて図示しにくいところにあるのではないでしょうか。

 方法としては、いくつか別バージョンの図を描くというのがあります。例えば、フレームツリー構造を示す図と、同じ名詞を用いてフレームがメッシュにぶら下がっている図を書くことができます。

 これがもっとも実用的かもしれません。しかし構造全体をイメージするのは至難の技です。

 そこで一目瞭然で構造を表現する方法を考えました。

 それは、ご覧のように3D表現してしまうことです。

 この方法にはいくつかの長所と短所があります。

 長所は、二次元的な図形では無理な概念も、立体図とすることで理解が容易になることで、短所は作図が極めて難しいばかりでなく、この図を見る際も、あちらこちらから眺めなくてはならないことです。

 究極のものは、やはり実物としてこのような構造があることなのですが、それはさすがに無理ですのでCGとして表現するのがいまのところ限界ではないでしょうか。

 実験的な意味もこめて、Truespaceで作ったこのデータをダウンロードできるようにしてありますので興味のある方は図をクリックしてみてください。

 説明用の概念図としては充分かもしれませんが、実際のハイパーリンクや多重階層構造を無理なく表現する方法として、三次元的な作図法はこれからどんどん発展していくでしょう。