Неверно отрисовывается фрактал методом L- системы

Необходимо нарисовать фрактал методом L-системы.

Аксиома: F

Правила:

  • F → F+F-F-F-B+F+F+F-F
  • B → BBB

Здесь B означает переместиться вперёд на один шаг, не прорисовывая след.

public void DrawF(int x, int y, int step, double angle,String rules, PaintEventArgs e)
{
    double x1 = x;
    double y1 = y;
    Graphics g = e.Graphics;
    foreach(char a in rules)
    {
        if (a.Equals('F'))
        {
            x1 += step;
            y1 += step;
            g.DrawLine(new Pen(Color.Blue), x, y,(int) x1,(int) y1);
            x =(int) x1;
            y=(int)y1;
        }
        if (a.Equals('B'))
        {
            x1 = x1 + step;
            x = (int)x1;
            y1 = y1 + step;
            y = (int)y1;
        }
        if (a.Equals('-'))
        {
            x1 = x1 - step * Math.Sin(Math.PI/2);
            y1 = y1 - step * Math.Cos(Math.PI/2);
        }
        if (a.Equals('+'))
        {
            x1 = x1 + step * Math.Sin(Math.PI / 2);
            y1 = y1 + step * Math.Cos(Math.PI / 2);
        }
    }
}

Но вместо ковра Серпинского рисуется это

Никак не могу понять где ошибка


Ответы (1 шт):

Автор решения: Danis
public void DrawF(int x, int y, int step, double angle,String rules, PaintEventArgs e)
    {

        double x1 = x;
        double y1 = y;
        Graphics g = e.Graphics;
         float angle = 0;

        foreach(char a in rules)
        {
            if (a.Equals('F'))
            {
                x1 += step * Math.Sin(angle);
                y1 += step * Math.Cos(angle);
                g.DrawLine(new Pen(Color.Blue), x, y,(int) x1,(int) y1);
                x =(int) x1;
                y=(int)y1;
                
            }
            if (a.Equals('B'))
            {
                x1 += step * Math.Sin(angle);
                y1 += step * Math.Cos(angle);

                x = (int)x1;
                y =(int) y1;
            }
            if (a.Equals('-'))
            {
                angle -= Math.Pi / 3;
            }
            if (a.Equals('+'))
            {
                angle += Math.Pi / 3;
            }
        } 
→ Ссылка