Процедурный дракон

 


Полгода назад на форуме Picocalc увидел программу и решил переделать код на две платформы. Всё это время исходник с картинкой провалялись в папке и неделю назад я вернулся к этой задаче. Набрал код, переписал команды и застрял - рисуется только хвост и голова. Я долго проверял программу с исходником, и наконец нашел, в чем была ошибка.

Dim gcol(3)
gcol(0)=#Yellow
gcol(1)=#Red
gcol(2)=0
gcol(3)=#White
If OpenWindow(0, 0, 0, 320, 320, "Procedural dragon", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, 320, 320)
  
  s.f=Sin(0.03)
  c.f=Cos(0.03)
  x.f=260
  y.f=20
  u.f=0
  V.f=1
  If StartDrawing(CanvasOutput(0))
    Box(0,0,320,320,0)
    ;body
    For A.l=80 To 1200
      X=X+U
      Y=Y+V
      K.f=Sign( Cos(A/45)*Cos(A*0.0138) )
      T.f=U
      U=U*C-K*V*S
      V=V*C+K*T*S
      Z=24-A%10
      For B=-Z To Z
        R.f=1-80/A
        If Abs(B)>16
          bf=1
        Else
          bf=0
        EndIf
        aa=Int(A/4)%2
        If Int(3*Abs(Cos(B*0.3+aa*#PI/2+0.4)))=A%4
          ff=1
        Else
          ff=0
        EndIf
        CI=1+ff-bf
        
        Box(Int(X+R*B*V),250-(Y-R*B*U),1,1,GCOL(CI))
      Next B
    Next A
    ;head
    k=190
    For J=0 To K
      R=(200-80*Cos(J*3*#PI/K))*(0.8+0.5*Cos(J*13*#PI/K)*Cos(J*13*#PI/K))
      For I=0 To R Step 5
        If Int(i/15)=3
          f2=1
        Else
          f2=0
        EndIf
        
        If Int(j/20)=4
          f1=1
        Else
          f1=0
        EndIf
        
        If Int(i/30)=3
          f3=1
        Else
          f3=0
        EndIf
        
        If Int(j/12)=14
          f4=1
        Else
          f4=0
        EndIf
        CI=Abs(1.2-(I/R)-f1*(2*f2+1)-f4*f3)
        S.f=Sin(J*#PI/K):C.f=Cos(J*#PI/K):V.f=8*Sin(I/16)
        Box(160+(I*S+V*C)/4,70-(I*C+V*S)/4,1,1,GCOL(CI))
        Box(160-(I*S+V*C)/4,70-(I*C+V*S)/4,1,1,GCOL(CI))
      Next i
    Next j
    
    StopDrawing()
  EndIf
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf

Оригинальный исходник:

;https://www.thebackshed.com/forum/ViewTopic.php?TID=17161&P=3
MODE 2
Dim GCOL(3)=(RGB(YELLOW),RGB(RED),RGB(BLACK),RGB(WHITE))
S=Sin(.03):C=Cos(.03):X=260:Y=20:U=0:V=1
For A=80 To 1200
X=X+U:Y=Y+V:K=Sgn(Cos(A/45)*Cos(A*.0138))
T=U:U=U*C-K*V*S:V=V*C+K*T*S:Z=24-A Mod 10
For B=-Z To Z
R=1-80/A
CI=1+(Int(3*Abs(Cos(B*.3+(A\4 Mod 2)*Pi/2+.4)))=A Mod 4)-(Abs(B)>16)
Colour GCOL(CI)
Pixel 1*Int(X+R*B*V),250-1*(Y-R*B*U)
Next :Next
K=190
For J=0 To K
R=(200-80*Cos(J*3*Pi/K))*(.8+.5*Cos(J*13*Pi/K)*Cos(J*13*Pi/K))
For I=0 To R Step 5
CI=1.2-(I/R)-(J\20=4)*(2*(I\15=3)+1)-(J\12=14)*(I\30=3)
Colour GCOL(Abs(CI))
S=Sin(J*Pi/K):C=Cos(J*Pi/K):V=8*Sin(I/16)
Pixel 160+(I*S+V*C)/4,70-(I*C+V*S)/4
Pixel 160-(I*S+V*C)/4,70-(I*C+V*S)/4
Next : Next

Архив

Комментарии