4

C++ で L-System 書き換えエンジンを実装するためのデータ構造を設計しようとしていますが、どこにも到達できないようです :(.

シンボル (文字) の文字列を格納する必要があります。シンボルにはいくつかのタイプがあります (LSystem のアルファベットによって指定されます)。タイプ「A」、「B」、「C」があるとしましょう。現在、シンボルの各タイプは異なるパラメータを持つことができます。たとえば、タイプ A のシンボルには距離があり、シンボル B には角度があります。C シンボルにはパラメーターがありません。文字列は "ABABC" のようになります。

次に、文字列を繰り返し処理し、各タイプのシンボルにも関連付けられているいくつかのアクションを実行する必要があります。「A」は「「距離」の長さの線を引く」(距離は A のパラメータ)、B は「「角度」度を回す」、C はペイントを終了することを意味します。

クラス Symbol と各シンボル タイプ (クラス SymbolA、クラス SymbolB、クラス SymbolC) の子を作成しようとしましたが、文字列の作成方法がわかりません。型キャストなどは避けたいと思います。

同様の問題を抱えている人、または私を助けることができるアイデアを持っている人はいますか?

4

2 に答える 2

1

完全なLシステムのように複雑なものを実装したい場合は、PythonやCommonLispなどのC++よりも高水準の言語を使用することをお勧めします。次に、コード全体のプロファイルを作成し、C /C++で速度のボトルネックを実装できます。

私はずっと前に、CommonLispを使用してカオス理論とフラクタルのコースのためにL-システムを実装しました。難しいことではありませんでした。記号のリストを使用しただけです。私はそのコードを見つけようとしてきましたが、7年以上経っているので、今のところ運がありません。

とにかく、これは私にとってはるかに合理的なアプローチのようです。高水準言語で遅い実装を行ったとしても、それをC ++で実装する方法についてより良いアイデアが得られ、開発者の時間がはるかに長くなります。

于 2011-05-25T02:40:18.917 に答える
0

あなたは正しい方向に進んでいるようです。実装する必要のある操作の種類に対して純粋仮想関数を定義するSymbolBaseクラスが必要です。次に、それぞれが特定の機能を実装するSymbolA、SymbolBなどの派生クラスが必要です。要素を画面にペイントするために、各クラスは、グラフィックスオブジェクトなどを引数として取り、それ自体をグラフィックスオブジェクトにペイントする関数を実装します。

これらを「文字列」で表すには、ある種の線形コレクション、STLベクトル、またはリンクリストが必要です。Lシステムプロダクションを使用してシンボルを再配置する場合は、リンクリストの方が効率的です。その後、リストを繰り返して画面に表示できるようになります。コレクション内のさまざまなクラスのインスタンスを保持するという通常の問題が発生します。ここで、要素タイプは基本クラスへのポインターです。通常、型キャストをあまり多くしなくても機能させることができます(必要な場合は、常にdynamic_castを使用してください)。基本クラスを正しく設計すれば、呼び出し元のコードは、実際に対話している特定のシンボルクラスを気にすることなく、基本クラスの純粋な抽象関数を呼び出すことができるはずです。

于 2011-07-20T14:41:45.500 に答える