flowsnake

 


Случайно узнал, что кривая Peano-Gosper называется по-другому. Эту картинку можно построить с использованием L-system, но джависты решили иначе:

Global START_X=100
Global START_Y=100
Global START_ANGLE=0
Global ANGLE=60
Global START_LENGTH = 300
Global x.f,y.f,an.f
Global iter=3
Procedure curve(ci,t$,ln.f)
          If ci > 0
            ln =ln/Sqr(7)
            ci=ci-1;ci--
            
            If t$ = "a"
                curve(ci, "a", ln);
                an=an+ANGLE;
                curve(ci, "b", ln);
                an=an+2 * ANGLE;
                curve(ci, "b", ln);
                an=an-ANGLE;
                curve(ci, "a", ln);
                an=an- 2 * ANGLE;
                curve(ci, "a", ln);
                curve(ci, "a", ln);
                an=an-ANGLE;
                curve(ci, "b", ln);
                an=an+ANGLE;
            Else
                an=an-ANGLE;
                curve(ci, "a", ln);
                an=an+ANGLE;
                curve(ci, "b", ln);
                curve(ci, "b", ln);
                an=an+2 * ANGLE;
                curve(ci, "b", ln);
                an=an+ANGLE;
                curve(ci, "a", ln);
                an=an-2 * ANGLE;
                curve(ci, "a", ln);
                an=an-ANGLE;
                curve(ci, "b", ln);
            EndIf
        Else
            ;g.setColor(COLOR_ITERATOR.Next());
          LineXY(x,y,x+ln*Cos(an*#PI/180),y+ln*Sin(an*#PI/180),$FFFFFF)
            x=x+ln*Cos(an*#PI/180)
            y=y+ln*Sin(an*#PI/180)
        EndIf
EndProcedure
If OpenWindow(0, 0, 0, 600, 600, "FlowSnake", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
    CanvasGadget(0, 0, 0, 600, 600)
        x = START_X;
        y = START_Y;
        an=START_ANGLE - (iter * ATan(Sqr(3) / 5)*180/#PI)
        If StartDrawing(CanvasOutput(0))
          Box(0,0,GadgetWidth(0),GadgetHeight(0),0)
        curve(iter, "a", START_LENGTH)
            StopDrawing()
          EndIf
    Repeat
      Event = WaitWindowEvent()
    Until Event = #PB_Event_CloseWindow
  EndIf

Комментарии