Случайно узнал, что кривая 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
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

Комментарии
Отправить комментарий