「毎日Unity」の技術ブログ

開発で役立つ情報を発信する

【Processing】L-system(2)

[ プログラム ]

import java.util.Arrays;

final int Width_Window = 600;
final int Height_Window = 600;

final String[] V = new String[]{"F"};
final String[] S = new String[]{"+", "-", "[", "]"};
final String W = "F";
final String[][] P = {new String[]{"F", "F[+F][-F[-F]F]F[+F][-F]"}};

String Current = W;

int Step = 0;

float Length = Height_Window / 3;
float Theta = radians(30);
float Rate = 0.5;

void settings()
{
    size(Width_Window, Height_Window);
}

void setup()
{
    println(Step + " : " + Current);

    Draw_Diagram();
}

void draw()
{

}

void mousePressed()
{
    String Next = "";

    for(int i = 0; i < Current.length(); i++)
    {
        final String Target = Current.substring(i, i + 1);

        if(Arrays.asList(S).contains(Target))
        {
            Next += Target;
        }
        else
        {
            for(int j = 0; j < P.length; j++)
            {
                if(Target.equals(P[j][0]))
                {
                    final int Random = (int)random(1, P[j].length);

                    Next += P[j][Random];

                    break;
                }
            }
        }
    }
    
    Current = Next;
    
    Length = Length * Rate;
    Step += 1;

    println(Step + " : " + Current);

    Draw_Diagram();
}

void Draw_Diagram() 
{
    background(255);

    translate(width / 2, height);

    for(int i = 0; i < Current.length(); i++)
    {
        final String Target = Current.substring(i, i + 1);

        if(Target.equals("F"))
        {
            line(0, 0, 0, -Length);
            translate(0, -Length);
        }
        else if(Target.equals("+"))
        {
            rotate(Theta);
        }
        else if(Target.equals("-"))
        {
            rotate(-Theta);
        }
        else if(Target.equals("["))
        {
            pushMatrix();
        }
        else if(Target.equals("]"))
        {
            popMatrix();
        }
    }
}

ウィンドウ内をクリックするとステップが進みます。

[ 実行結果 ]

0ステップ目

1ステップ目

2ステップ目

3ステップ目

4ステップ目

5ステップ目

[ 参考文献 ]

ja.wikipedia.org