PureBasic - форум

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

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


Вы здесь » PureBasic - форум » PureBasic для Windows » Параметрический кот


Параметрический кот

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

1

https://forumupload.ru/uploads/0009/ae/28/618/t779398.png
Найдено в Интернетах

Код:
If InitSprite() And OpenWindow(0,0,0,640,480,"CatCurve",#PB_Window_SystemMenu) And OpenWindowedScreen(WindowID(0),0,0,640,480,0,0,0) 
  ;   Repeat 
  StartDrawing(ScreenOutput()) 
  t.f=0
  mu=2
  While  t<2*#PI
    x.f=0-721/4*Sin(t)+196/3*Sin(2*t)-86/3*Sin(3*t)-131/2*Sin(4*t)
    x=x+477/14 *Sin(5 *t) + 27 *Sin(6 *t) - 29/2 *Sin(7 *t) + 68/5 *Sin(8*t)
    x=x+1/10 *Sin(9 *t) + 23/4 *Sin(10 *t) - 19/2 *Sin(12 *t) - 85/21 *Sin(13 *t)
    x=x+2/3*Sin(14*t)+27/5*Sin(15*t)+7/4*Sin(16*t)+17/9*Sin(17*t)
    x=x-4*Sin(18*t)-1/2*Sin(19*t)+1/6*Sin(20*t)+6/7*Sin(21*t)
    x=x-1/8*Sin(22*t)+1/3*Sin(23*t)+3/2*Sin(24*t)+13/5*Sin(25*t)
    x=x+Sin(26*t)-2*Sin(27*t)+3/5*Sin(28*t)-1/5*Sin(29*t)
    x=x+1/5*Sin(30*t)+(2337*Cos(t))/8-43/5*Cos(2*t)+322/5*Cos(3*t)
    x=x-117/5*Cos(4*t)-26/5*Cos(5*t)-23/3*Cos(6*t)+143/4*Cos(7*t)
    x=x-11/4*Cos(8*t)-31/3*Cos(9*t)-13/4*Cos(10*t)-9/2*Cos(11*t)
    x=x+41/20*Cos(12*t)+8*Cos(13*t)+2/3*Cos(14*t)+6*Cos(15*t)
    x=x+17/4*Cos(16*t)-3/2*Cos(17*t)-29/10*Cos(18*t)+11/6*Cos(19*t)
    x=x+12/5*Cos(20*t)+3/2*Cos(21*t)+11/12*Cos(22*t)-4/5*Cos(23*t)
    x=x+Cos(24*t)+17/8*Cos(25*t)-7/2*Cos(26*t)-5/6*Cos(27*t)
    x=x-11/10*Cos(28*t)+1/2*Cos(29*t)-1/5*Cos(30*t)
    
    y.f =  -(637 * Sin(t)) / 2 - 188 / 5 * Sin(2 * t) - 11 / 7 * Sin(3 * t)
    y=y- 12 / 5 * Sin(4 * t) + 11 / 3 * Sin(5 * t) - 37 / 4 * Sin(6 * t)
    y=y+ 8 / 3 * Sin(7 * t) + 65 / 6 * Sin(8 * t) - 32 / 5 * Sin(9 * t)
    y=y- 41 / 4 * Sin(10 * t) - 38 / 3 * Sin(11 * t) - 47 / 8 * Sin(12 * t)
    y=y+ 5 / 4 * Sin(13 * t) - 41 / 7 * Sin(14 * t) - 7 / 3 * Sin(15 * t)
    y=y- 13 / 7 * Sin(16 * t) + 17 / 4 * Sin(17 * t) - 9 / 4 * Sin(18 * t)
    y=y+ 8 / 9 * Sin(19 * t) + 3 / 5 * Sin(20 * t) - 2 / 5 * Sin(21 * t)
    y=y+ 4 / 3 * Sin(22 * t) + 1 / 3 * Sin(23 * t) + 3 / 5 * Sin(24 * t)
    y=y- 3 / 5 * Sin(25 * t) + 6 / 5 * Sin(26 * t) - 1 / 5 * Sin(27 * t)
    y=y+ 10 / 9 * Sin(28 * t) + 1 / 3 * Sin(29 * t) - 3 / 4 * Sin(30 * t)
    y=y- (125 * Cos(t)) / 2 - 521 / 9 * Cos(2 * t) - 359 / 3 * Cos(3 * t)
    y=y+ 47 / 3 * Cos(4 * t) - 33 / 2 * Cos(5 * t) - 5 / 4 * Cos(6 * t)
    y=y+ 31 / 8 * Cos(7 * t) + 9 / 10 * Cos(8 * t) - 119 / 4 * Cos(9 * t)
    y=y- 17 / 2 * Cos(10 * t) + 22 / 3 * Cos(11 * t) + 15 / 4 * Cos(12 * t)
    y=y- 5 / 2 * Cos(13 * t) + 19 / 6 * Cos(14 * t) + 7 / 4 * Cos(15 * t)
    y=y+ 31 / 4 * Cos(16 * t) - Cos(17 * t) + 11 / 10 * Cos(18 * t)
    y=y- 2 / 3 * Cos(19 * t) + 13 / 3 * Cos(20 * t) - 5 / 4 * Cos(21 * t)
    y=y+ 2 / 3 * Cos(22 * t) + 1 / 4 * Cos(23 * t) + 5 / 6 * Cos(24 * t)
    y=y+ 3 / 4 * Cos(26 * t) - 1 / 2 * Cos(27 * t) - 1 / 10 * Cos(28 * t)
    y=y- 1 / 3 * Cos(29 * t) - 1 / 19 * Cos(30 * t)
    
    Box(x/mu+320,240-y/mu,1,1,$FFFFFF)
    t=t+1/300
  Wend
  StopDrawing() 
  FlipBuffers() 
  Repeat 
  Until WindowEvent()=#PB_Event_CloseWindow 
EndIf

Отредактировано egons (21.03.2025 09:55:26)

0

2

при запуске программы температура ЦП подскакивает на 20+С, хотя загрузки нет!!!

0

3

Фред говорил что спрайтовые игры должны использовать спрайты - готовые рисунки, а возможность рисовать доступна только для теста и отладки, иначе это на корню рубит производительность. Спрайты выгружаются из видюхи в память рисуются и загружаются обратно. Движок спрайтов расчитан, чтобы спрайты рисовала видюха храня их в своей памяьи.

0

4

Не думаю, что здесь замешаны спрайты. Наверное, прямой доступ к окну с помощью DirectX.

0

5

InitSprite() и FlipBuffers() это элементы спрайтовского движка. В канвасе можно сделать.

Отредактировано AZJIO (21.03.2025 19:09:06)

0

6

Угу, найдется еще один пользователь, у которого тормозит на канвасе.

0

7

Вообще ничего не рисует. Просто чёрное окно.

0

8

Smitis
на секунду моргнёт котом и пропадёт.

0

9

Да, иногда промаргивает.

0

10

Вот вы противные :/

Код:
If OpenWindow(0, 0, 0, 640, 480, "Parametric Cat", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 0, 0, 640, 480)
  
  If StartDrawing(CanvasOutput(0))
    Box(0,0,640,480,0)
    t.f=0
    mu=2
    While  t<2*#PI
      x.f=0-721/4*Sin(t)+196/3*Sin(2*t)-86/3*Sin(3*t)-131/2*Sin(4*t)
      x=x+477/14 *Sin(5 *t) + 27 *Sin(6 *t) - 29/2 *Sin(7 *t) + 68/5 *Sin(8*t)
      x=x+1/10 *Sin(9 *t) + 23/4 *Sin(10 *t) - 19/2 *Sin(12 *t) - 85/21 *Sin(13 *t)
      x=x+2/3*Sin(14*t)+27/5*Sin(15*t)+7/4*Sin(16*t)+17/9*Sin(17*t)
      x=x-4*Sin(18*t)-1/2*Sin(19*t)+1/6*Sin(20*t)+6/7*Sin(21*t)
      x=x-1/8*Sin(22*t)+1/3*Sin(23*t)+3/2*Sin(24*t)+13/5*Sin(25*t)
      x=x+Sin(26*t)-2*Sin(27*t)+3/5*Sin(28*t)-1/5*Sin(29*t)
      x=x+1/5*Sin(30*t)+(2337*Cos(t))/8-43/5*Cos(2*t)+322/5*Cos(3*t)
      x=x-117/5*Cos(4*t)-26/5*Cos(5*t)-23/3*Cos(6*t)+143/4*Cos(7*t)
      x=x-11/4*Cos(8*t)-31/3*Cos(9*t)-13/4*Cos(10*t)-9/2*Cos(11*t)
      x=x+41/20*Cos(12*t)+8*Cos(13*t)+2/3*Cos(14*t)+6*Cos(15*t)
      x=x+17/4*Cos(16*t)-3/2*Cos(17*t)-29/10*Cos(18*t)+11/6*Cos(19*t)
      x=x+12/5*Cos(20*t)+3/2*Cos(21*t)+11/12*Cos(22*t)-4/5*Cos(23*t)
      x=x+Cos(24*t)+17/8*Cos(25*t)-7/2*Cos(26*t)-5/6*Cos(27*t)
      x=x-11/10*Cos(28*t)+1/2*Cos(29*t)-1/5*Cos(30*t)
      
      y.f =  -(637 * Sin(t)) / 2 - 188 / 5 * Sin(2 * t) - 11 / 7 * Sin(3 * t)
      y=y- 12 / 5 * Sin(4 * t) + 11 / 3 * Sin(5 * t) - 37 / 4 * Sin(6 * t)
      y=y+ 8 / 3 * Sin(7 * t) + 65 / 6 * Sin(8 * t) - 32 / 5 * Sin(9 * t)
      y=y- 41 / 4 * Sin(10 * t) - 38 / 3 * Sin(11 * t) - 47 / 8 * Sin(12 * t)
      y=y+ 5 / 4 * Sin(13 * t) - 41 / 7 * Sin(14 * t) - 7 / 3 * Sin(15 * t)
      y=y- 13 / 7 * Sin(16 * t) + 17 / 4 * Sin(17 * t) - 9 / 4 * Sin(18 * t)
      y=y+ 8 / 9 * Sin(19 * t) + 3 / 5 * Sin(20 * t) - 2 / 5 * Sin(21 * t)
      y=y+ 4 / 3 * Sin(22 * t) + 1 / 3 * Sin(23 * t) + 3 / 5 * Sin(24 * t)
      y=y- 3 / 5 * Sin(25 * t) + 6 / 5 * Sin(26 * t) - 1 / 5 * Sin(27 * t)
      y=y+ 10 / 9 * Sin(28 * t) + 1 / 3 * Sin(29 * t) - 3 / 4 * Sin(30 * t)
      y=y- (125 * Cos(t)) / 2 - 521 / 9 * Cos(2 * t) - 359 / 3 * Cos(3 * t)
      y=y+ 47 / 3 * Cos(4 * t) - 33 / 2 * Cos(5 * t) - 5 / 4 * Cos(6 * t)
      y=y+ 31 / 8 * Cos(7 * t) + 9 / 10 * Cos(8 * t) - 119 / 4 * Cos(9 * t)
      y=y- 17 / 2 * Cos(10 * t) + 22 / 3 * Cos(11 * t) + 15 / 4 * Cos(12 * t)
      y=y- 5 / 2 * Cos(13 * t) + 19 / 6 * Cos(14 * t) + 7 / 4 * Cos(15 * t)
      y=y+ 31 / 4 * Cos(16 * t) - Cos(17 * t) + 11 / 10 * Cos(18 * t)
      y=y- 2 / 3 * Cos(19 * t) + 13 / 3 * Cos(20 * t) - 5 / 4 * Cos(21 * t)
      y=y+ 2 / 3 * Cos(22 * t) + 1 / 4 * Cos(23 * t) + 5 / 6 * Cos(24 * t)
      y=y+ 3 / 4 * Cos(26 * t) - 1 / 2 * Cos(27 * t) - 1 / 10 * Cos(28 * t)
      y=y- 1 / 3 * Cos(29 * t) - 1 / 19 * Cos(30 * t)
      
      Box(x/mu+320,240-y/mu,1,1,$FFFFFF)
      t=t+1/300
    Wend
    StopDrawing() 
  Else
    Debug "Upgrade hardware and system"
  EndIf
  
  Repeat
    Event = WaitWindowEvent()
  Until Event = #PB_Event_CloseWindow
EndIf

0

11

egons
Почему Box, а не Plot? Если уж Box, то точку надо сделать 2 пикселя, чётче будет виден.

Код:
      pt = 6
      Box(x/mu+320,240-y/mu,pt,pt,$FFFFFF)
;       Plot(x/mu+320,240-y/mu,$FFFFFF)
Код:
Debug "Upgrade hardware and system"

канвас стабилен как часы, это не 3D графика которая привязна к драйверу и движку 3D, которые могут не существовать в ОС.

3. Если это статичный рисунок, то однозначно канвас, даже ни каких сомнений ни на милисекунду. Или CreateImage()

Отредактировано AZJIO (23.03.2025 18:16:28)

0

12

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

egons
Почему Box, а не Plot? Если уж Box, то точку надо сделать 2 пикселя, чётче будет виден.
)

Plot давится, если выход координат за пределы области, Box - нет

0

13

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

Plot давится, если выход координат за пределы области, Box - нет

а не будет ли здесь потеря скорости?
надо думать что box проверки делает, значит медленней
может лучше правильно цикл организовать?

0

14

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

а не будет ли здесь потеря скорости?
надо думать что box проверки делает, значит медленней
может лучше правильно цикл организовать?

Стесняюсь спросить - где тут потеря скорости? тут не анимация, а расчет.

0

15

Вот разница в ASM для упрощённого кода, чтобы проверить что там проверяется

Код:
If OpenWindow(0, 0, 0, 640, 480, "", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
	CanvasGadget(0, 0, 0, 440, 480)
	If StartDrawing(CanvasOutput(0))
    Box(1,1,1,1,$80FFFF)
;     Plot(1,1,$80FFFF)
    StopDrawing() 
	EndIf
	Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Код:
; 
; Plot(1,1,$80FFFF)
  PUSH   qword 8454143
  PUSH   qword 1
  PUSH   qword 1
  POP    rcx
  POP    rdx
  POP    r8
  CALL   PB_Plot2
Код:
; Box(1,1,1,1,$80FFFF)
  SUB    rsp,8
  PUSH   qword 8454143
  PUSH   qword 1
  PUSH   qword 1
  PUSH   qword 1
  PUSH   qword 1
  POP    rcx
  POP    rdx
  POP    r8
  POP    r9
  SUB    rsp,32
  CALL   PB_Box2
  ADD    rsp,48
; 

С новым плагом просто получил два файла в AkelPad и скриптом сравнения сравнил две вкладки.

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

Отключил отладчик DisableDebugger и Plot перестал выдавать ошибку.

Отредактировано AZJIO (25.03.2025 13:03:10)

0

16

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

Отключил отладчик DisableDebugger и Plot перестал выдавать ошибку.

Намедни копался с WebP, при выполнении стала вылезать ошибка - ширина Image не может быть выше 32000.
Влепил DisableDebugger и тут такое понеслось, что не описать.

Переписал код заново, и заработало.

0

17

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

ширина Image не может быть выше 32000

Картинка размером 32 на 32 тысячи пикселей требует 3 ГБ ОЗУ при 24 бит и 4 ГБ при 32 бит. Процесс обязательно должен быть 64 битным и необходим достаточный объем свободной памяти.

0

18

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

Стесняюсь спросить - где тут потеря скорости? тут не анимация, а расчет.

1. неправильно организовать цикл, это уже неправильно

2. бокс для заливки фона использует кисть, которую нужно создать, вот оно время
кажется кисть создаётся 8х8, красить фон по одному пикселю слишком долго

0

19

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

1. неправильно организовать цикл, это уже неправильно

Странно, но у меня рисует быстро и без исчезания.

0

20

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

Странно, но у меня рисует быстро и без исчезания.

упрямый товарищ, речь о заведомо неправильно организованном цикле
а быстро, так всему есть предел, вот тогда пушной зверёк в гости и заглянет :crazyfun:

0

21

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

упрямый товарищ, речь о заведомо неправильно организованном цикле

TOJICTO

0

22

Код:
Structure pp
  x.l
  y.l
  dx.l
  dy.l
EndStructure

Dim pts.pp(2)

With pts(0)
  \x=160
  \y=120
  \dx=-1
  \dy=-1
EndWith

With pts(1)
  \x=0
  \y=0
  \dx=1
  \dy=1
EndWith

Dim col.l(255)

If InitSprite() And OpenWindow(0,0,0,640,480,"Magnetic",#PB_Window_ScreenCentered|#PB_Window_SystemMenu|#PB_Window_MinimizeGadget) And OpenWindowedScreen(WindowID(0),0,0,640,480,0,0,0)
  
  CreateImage(0,256,64,24)
  StartDrawing(ImageOutput(0))
  DrawingMode(#PB_2DDrawing_Gradient)      
  BackColor($ff0000)
  FrontColor($0000ff)
  LinearGradient(0, 0, 256, 64)
  Box(0,0,256,64)
  For i=0 To 255
    col(i)=Point(i,0)
  Next i
  StopDrawing()
  
  Repeat 
    StartDrawing(ScreenOutput()) 
    
    x0=pts(0)\x
    y0=pts(0)\y
    x1=pts(1)\x
    y1=pts(1)\y
    
    For x=0 To 319
      xx0=(x-x0)*(x-x0)
      xx1=(x-x1)*(x-x1)
      For y=0 To 239
        ;v.l=Int( 255*(x-x0)*(x-x0)/( (x-x0)*(x-x0)+(y-y0)*(y-y0)+1 ) )
        v.l=Int( 255*xx0/( xx0+(y-y0)*(y-y0)+1 ) )
        ;u.l=Int( 255*(x-x1)*(x-x1)/( (x-x1)*(x-x1)+(y-y1)*(y-y1)+1 ) )
        u.l=Int( 255*xx1/( xx1+(y-y1)*(y-y1)+1 ) )
        
        r.u=u+v
        If r>255
          r=(r!255)&255
        EndIf
        c=col(r)
        Plot(x*2,y*2,c)
        Plot(x*2+1,y*2,c)
        Plot(x*2+1,y*2+1,c)
        Plot(x*2,y*2+1,c)
      Next y
    Next x
    
    For j=0 To 1
      x0=pts(j)\x
      dx0=pts(j)\dx
      y0=pts(j)\y
      dy0=pts(j)\dy
      For i=0 To 2
        x0+dx0
        If x0=0 Or x0=319
          dx0=-dx0
        EndIf
        y0+dy0
        If y0=0 Or y0=239
          dy0=-dy0
        EndIf
      Next i
      pts(j)\x=x0
      pts(j)\dx=dx0
      pts(j)\y=y0
      pts(j)\dy=dy0
      
    Next j
    
    If GetAsyncKeyState_(#VK_ESCAPE)&32768
      Break
    EndIf
    
    ;DrawImage(ImageID(0),0,0)
    StopDrawing()
    FlipBuffers()
    
  Until WindowEvent()=#PB_Event_CloseWindow 
EndIf

гм, с Box рисуется медленнее.

0


Вы здесь » PureBasic - форум » PureBasic для Windows » Параметрический кот