これはおそらく、いくつかのサードパーティライブラリを検索して統合しようとするよりも、自分で最初から実装する方が速い問題です。
Lシステムの実装はかなり簡単です。2つの部分を実装する必要があります。
最初の部分は文字列書き換えシステムです。簡単です。書き換えルール(charキー、文字列値)の辞書があれば、それらのルールを最初の文字列i回(iは反復回数)に適用する必要があります。
擬似コード:
map<char, string> rewriteRules = {{'L', "L+R+"}, {'R',"-L+R"}};
string rewrite(string str) {
string result = "";
for each (char c in str) {
if (rewriteRules contains key c) {
result += rewriteRules[c];
}
else {
result += c; // identity
}
}
}
2番目の難しい部分は、シンボルの結果文字列の解釈です。カメのようなグラフィックを3Dで解釈する最も簡単な方法は、クォータニオンを使用することです。これらを組み合わせるのは簡単です。
上記の書き換えルールはドラゴン曲線を説明しており、記号の意味は次のとおりです。
- L、R:前方に線を引く
- +:左に90度回転します
- -:右に90度曲がる
次のコードスニペットは、クォータニオンを使用した3Dでの移動と回転の実装を示しています。それはC#で書かれた私のLシステムインタプリタからのものです(あなたが私を許してくれることを願っています:)。
Quaternion rotationQuat = Quaternion.Indentity;
Vector3D position;
Vector3D forwardVector = new Vector3D(1, 0, 0);
Vector3D upVector = new Vector3D(0, 1, 0);
Vector3D rightVector = forwardVector.Cross(upVector);
public void Forward(double distance, bool draw) {
Vector3D moveVector = rotationQuat.Transform(forwardVector * distance);
Vector3D oldPosition = position;
position += moveVector;
if (draw) {
// draw cylinder/box from oldPosition to (new) position
}
}
public void Yaw(double angle) {
rotationQuat *= new Quaternion(upVector, angle);
}
public void Pitch(double angle) {
rotationQuat *= new Quaternion(rightVector, angle);
}
public void Roll(double angle) {
rotationQuat *= new Quaternion(forwardVector, angle);
}
したがって、文字列を解釈するには、文字列を調べて各記号を解釈する必要があります。最も簡単な方法は、切り替えるだけです。
for each (char c in string) {
switch(c) {
case 'L':
case 'R':
Forward(10, true);
break;
case '+':
Yaw(90);
break;
case '-':
Yaw(-90);
break;
default:
break; // do nothing
}
}
L-システムを(3Dでも)実験したい場合は、それができる素晴らしいWebサイトhttp://malsys.czがあります(これらのC#スニペットはそこからのものです:)
Lシステムで頑張ってください!