PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » Вопросы по PureBasic » снова qbasic


снова qbasic

Сообщений 1 страница 8 из 8

1

https://forumupload.ru/uploads/0009/ae/28/618/t114541.png

Попалась одна програмка:

Код:
CLS : a% = 0
FOR theta = 0 TO 2 * pi STEP .015
rad = -(.5 * SIN(5 * theta)) * (.5 * COS(4 * theta)) * 1000
angle = theta + SIN(rad / 100)
xp = 320 + rad * COS(angle)
yp = 240 + rad * SIN(angle)
IF a% THEN
   LINE -(xp, yp)
ELSE
   a% = 1: PSET (xp, yp)
END IF
IF INKEY$ <> "" THEN GOTO fl2
NEXT theta
GOSUB wkey
fl2:

Решил переписать код на PB:

Код:
Enumeration
  #ca  
EndEnumeration

Procedure drawpath(num)
  StartDrawing(ImageOutput(0))
  Box(0,0,640,480,0)
  theta.f=0
  df=0
  x0.l
  y0.l
  xp.l
  yp.l
  
      While theta<2*#PI
        rad.f = -(0.5 * Sin(5 * theta)) * (0.5 * Cos(4 * theta)) * 1000
        angle.f = theta + Sin(rad / 100)
        xp = Int(320 + rad * Cos(angle))
        yp = Int(240 + rad * Sin(angle))

        If df
          LineXY(x0,y0,xp,yp,$FFFFFF)
          x0=xp
          y0=yp
        Else
          x0=xp
          y0=yp
          df=1
        EndIf
        theta=theta+0.15
      Wend
  StopDrawing()
  StartDrawing(CanvasOutput(#ca))
  DrawImage(ImageID(0),0,0)
  StopDrawing()    
  
EndProcedure
If OpenWindow(0, 0, 0, 640, 480, "sinpaths", #PB_Window_SystemMenu | #PB_Window_ScreenCentered|#PB_Window_BorderLess)
  CanvasGadget(#ca, 0, 0, 640, 480)
  
  CreateImage(0,640,480)
  
  drawpath(2)
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf

Понятно, узор получается другой. Где я ошибся?

0

2

egons написал(а):

Где я ошибся?

Код:
theta=theta+0.015

0

3

в движении прикольно выглядит

Код:
Enumeration
  #ca  
EndEnumeration

Procedure drawpath(num)
  StartDrawing(ImageOutput(0))
  Box(0,0,640,480,0)
  theta.f=0
  df=0
  x0.l
  y0.l
  xp.l
  yp.l
  
  While theta<2*#PI
    rad.f = -(0.5 * Sin(5 * theta)) * (0.5 * Cos(4 * theta)) * 1000
    angle.f = theta + Sin(rad / num)
    xp = Int(320 + rad * Cos(angle))
    yp = Int(240 + rad * Sin(angle))
    
    If df
      LineXY(x0,y0,xp,yp,$FFFFFF)
      x0=xp
      y0=yp
    Else
      x0=xp
      y0=yp
      df=1
    EndIf
    theta=theta+0.015
  Wend
  StopDrawing()
  StartDrawing(CanvasOutput(#ca))
  DrawImage(ImageID(0),0,0)
  StopDrawing()    
  
EndProcedure
If OpenWindow(0, 0, 0, 640, 480, "sinpaths animaton", #PB_Window_SystemMenu | #PB_Window_ScreenCentered|#PB_Window_BorderLess)
  CanvasGadget(#ca, 0, 0, 640, 480)
  
  CreateImage(0,640,480)
  For x=0 To 1000
    drawpath(x)
    Delay(10)
  Next

  For x=0 To 1000
    drawpath(1000-x)
    Delay(10)
  Next
  
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf

0

4

Lin
у меня так не работает, так как давно заметил, что перед началом цикла опроса событий бесполезно что-то делать, гуи рисуется после где-то 15-го шага цикла, поэтому пока цикл не начался всё находится в запрете на прорисовку.

Код:
If OpenWindow(0, 0, 0, 640, 480, "sinpaths animaton", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_BorderLess)
	CanvasGadget(#ca, 0, 0, 640, 480)
	
	CreateImage(0, 640, 480)
	; 	drawpath(100)
	z = 1
	x = 80
	Repeat
    Event = WaitWindowEvent()
    x+z
    If x > 500
    	z = -1
    ElseIf x < 80
    	z = 1
    EndIf
    drawpath(x)
	Until Event = #PB_Event_CloseWindow
EndIf

0

5

Пётр написал(а):

egons написал(а):
Где я ошибся?

Код:
theta=theta+0.015

пояснительная бригада нужна

0

6

egons написал(а):

пояснительная бригада нужна

В оригинальном коде .015, это 0.015
В PB коде 0.15, а должно быть 0.015

0

7

ох, блин, спасибо! проглядел. я по-другому код написал

Код:
  For t.l=0 To 42000;Int(2*#PI/0.15)
    ;While theta<2*#PI
    theta=t*0.15
        rad.f = -(0.5 * Sin(5 * theta)) * (0.5 * Cos(4 * theta)) * 1000
        angle.f = theta + Sin(rad / 100)
        xp = Int(320 + rad * Cos(angle))
        yp = Int(240 + rad * Sin(angle))
        
        Box (xp,yp,1,1,$FFFFFF)
        If df
;          LineXY(x0,y0,xp,yp,$FFFFFF)
          x0=xp
          y0=yp
        Else
          x0=xp
          y0=yp
          df=1
        EndIf
        ;theta=theta+0.15
        ;Wend
    Next t

0

8

egons написал(а):

ох, блин, спасибо! проглядел. я по-другому код написал

Код:
Enumeration
  #ca  
EndEnumeration

Procedure drawpath(num)
  StartDrawing(ImageOutput(0))
  Box(0,0,640,480,0)
 
  df=0
  xp.l
  yp.l
  x0.l
  y0.l

  

  
  Theta.f=6.28319;
Cikl:

    rad.f = -(0.5 * Sin(25* theta)) * (0.5 * Cos(5* theta)) * 1000
    angle.f = theta + Sin(rad / num)
    xp = Int(320 + rad * Cos(angle))
    yp = Int(240 + rad * Sin(angle))
    
    If df
      LineXY(x0,y0,xp,yp,$FFFFFF)
      x0=xp
      y0=yp
    Else
      x0=xp
      y0=yp
      df=1
    EndIf




If Theta>0
Theta-0.0174533;1градус в радианах
Goto Cikl
EndIf
  
  
  StopDrawing()
  StartDrawing(CanvasOutput(#ca))
  DrawImage(ImageID(0),0,0)
  StopDrawing()    
  
EndProcedure
If OpenWindow(0, 0, 0, 640, 480, "sinpaths animaton", #PB_Window_SystemMenu | #PB_Window_ScreenCentered|#PB_Window_BorderLess)
  CanvasGadget(#ca, 0, 0, 640, 480)
  
  CreateImage(0,640,480)
  For x=0 To 1000
    drawpath(x)
    Delay(10)
  Next

  For x=0 To 1000
    drawpath(1000-x)
    Delay(10)
  Next
  
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf

Отредактировано Sergeihik (18.07.2022 21:45:36)

0


Вы здесь » PureBasic - форум » Вопросы по PureBasic » снова qbasic