purebasic.info

PureBasic forum
Текущее время: Чт июн 04, 2020 6:15 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: График анимация
СообщениеДобавлено: Пт май 22, 2020 3:13 pm 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 615
Благодарил (а): 42 раз.
Поблагодарили: 80 раз.
Пункты репутации: 2
Попробовал показать график работы тиристора взависимости от угла открытия. Во первых мерцает, во вторых перерисовывается фоновый график - серые линии. Как лучше один раз нарисовать фоновые линии, а потом как бы во втором слое рисовать анимацию графика?

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
EnableExplicit
 
#PI2 = 3.14159265358979
#iRad = #PI2 / 180
; #iRad = 57.2958
 
Global x_last.f = 0
Global y_last.f = 100 * Sin(Radian(0)) + 122
Global y_new.f = 0
Global j = 1
Global kon = 80
Global Event
Global a, i
 
If OpenWindow(0, 0, 0, 590, 320, "Пример Канвас контейнер", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
       
        CanvasGadget(0, 40, 20, 530, 260, #PB_Canvas_Container)
        ButtonGadget(2, 10, 10, 70, 27, "Старт")
        ButtonGadget(1, 10, 40, 70, 27, "Очистить")
        CloseGadgetList()
       
        Repeat
                Event = WaitWindowEvent()
               
                If Event = #PB_Event_Gadget
                        Select EventGadget()
                                       
                                Case 2
                                        For a = 180 To kon Step -1
                                                If StartDrawing(CanvasOutput(0))
                                                        For i = 0 To 360
                                                                ;                                                               y_new =  (270) / 222 * Sin(Radian(i * #iRad))
                                                                y_new =  100 * Sin(Radian(i)) + 122
                                                                ;                                                       Debug y_new
                                                                LineXY(x_last, y_last, i, y_new, $999999)
                                                                ;                                                               Plot(i, y_new, $999999)
                                                                x_last = i
                                                                y_last = y_new
                                                        Next
                                                        x_last = 0
                                                        y_last = 100 * Sin(Radian(0)) + 122
                                                        For i = 0 To 360 Step 5
                                                                ;                                                               y_new =  (270-150) / 222 * Sin(Radian(i * #iRad))
                                                                y_new = (100-50) * Sin(Radian(i)) + 122
                                                                LineXY(x_last, y_last, i, y_new, $999999)
                                                                ;                                                               Plot(i, y_new)
                                                                x_last = i
                                                                y_last = y_new
                                                        Next
                                                       
                                                       
                                                        ; y_new = (270 - i) / 222 * Sin(j / 5)
                                                        x_last = 0
                                                        y_last = 100 * Sin(Radian(0)) + 122
                                                        y_new = 0
                                                        ; LineXY(x_last, y_last, i, y_new, 0) ; К началу графика
                                                        For i = 0 To 360
                                                                If (i > a And i < 180) Or (i > 180 And (i - 180) > a)
                                                                        ;                                                                       y_new = (270) / 222 * Sin(i * #iRad)
                                                                        y_new =  100 * Sin(Radian(i)) + 122
                                                                        LineXY(x_last, y_last, i, y_new, $0000FF)
                                                                        x_last = i
                                                                        y_last = y_new
                                                                Else
                                                                        ;                                                                       y_new = (270-150) / 222 * Sin(i * #iRad)
                                                                        y_new = (100-50) * Sin(Radian(i)) + 122
                                                                        LineXY(x_last, y_last, i, y_new, $0000FF)
                                                                        x_last = i
                                                                        y_last = y_new
                                                                EndIf
                                                        Next
                                                        StopDrawing()
                                                        Delay(10)
;                                                               If StartDrawing(CanvasOutput(0))
;                                                                       Box(0, 0, 490, 240, #White)
;                                                                       StopDrawing()
;                                                               EndIf
                                                        If a > kon
                                                                ; очистить нарисованое для следующего кадра, но не в конце, оставив последний кадр.
                                                                If StartDrawing(CanvasOutput(0))
                                                                        Box(0, 0, 490, 240, #White)
                                                                        StopDrawing()
                                                                EndIf
                                                        EndIf
 
                                                EndIf
                                        Next
                                        ;                                               x = GetGadgetAttribute(0, #PB_Canvas_MouseX)
                                        ;                                               y = GetGadgetAttribute(0, #PB_Canvas_MouseY)
                                        ;                                               Circle(x, y, 10, RGB(Random(255), Random(255), Random(255)))
                                       
                                Case 1
                                        If StartDrawing(CanvasOutput(0))
                                                Box(0, 0,  490, 240, #White)
                                                StopDrawing()
                                        EndIf
                        EndSelect
                EndIf
               
        Until Event = #PB_Event_CloseWindow
EndIf



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: График анимация
СообщениеДобавлено: Пт май 22, 2020 3:22 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11650
Благодарил (а): 4 раз.
Поблагодарили: 502 раз.
AZJIO писал(а):
Во первых мерцает
Это убрать
Код:
1
2
3
4
5
6
7
              If a > kon
                ; очистить нарисованое для следующего кадра, но не в конце, оставив последний кадр.
                If StartDrawing(CanvasOutput(0))
                  Box(0, 0, 490, 240, #White)
                  StopDrawing()
                EndIf
              EndIf

После 30 строки
Код:
1
If StartDrawing(CanvasOutput(0))

добавить
Код:
1
Box(0, 0, 490, 240, #White)


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: График анимация
СообщениеДобавлено: Пт май 22, 2020 3:48 pm 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 615
Благодарил (а): 42 раз.
Поблагодарили: 80 раз.
Пункты репутации: 2
Кажется я понял, как не перерисовывать график, создать изображение
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
    If CreateImage(3, 530, 260, 32, RGB(255, 225, 255)) And StartDrawing(ImageOutput(3))
 
                For i = 0 To 360
                        y_new =  100 * Sin(Radian(i)) + 122
                        LineXY(x_last, y_last, i, y_new, $999999)
                        x_last = i
                        y_last = y_new
                Next
                x_last = 0
                y_last = 100 * Sin(Radian(0)) + 122
                For i = 0 To 360 Step 5
                        y_new = (100-50) * Sin(Radian(i)) + 122
                        LineXY(x_last, y_last, i, y_new, $999999)
                        x_last = i
                        y_last = y_new
                Next
 
        StopDrawing()
;        ImageGadget(4, 40, 20, 530, 260, ImageID(3))
    EndIf



А потом использовать DrawImage, то есть нарисовать на поверхности.


Готовое
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
EnableExplicit
 
Global x_last.f = 0
Global y_last.f = 100 * Sin(Radian(0)) + 122
Global y_new.f = 0
Global j = 1
Global kon = 80
Global Event
Global a, i
 
 
If OpenWindow(0, 0, 0, 590, 320, "Пример Канвас контейнер", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
 
        CanvasGadget(0, 40, 20, 530, 260, #PB_Canvas_Container)
        ButtonGadget(2, 10, 10, 70, 27, "Старт")
        ButtonGadget(1, 10, 40, 70, 27, "Очистить")
        CloseGadgetList()
 
    If CreateImage(3, 530, 260, 32, RGB(255, 255, 255)) And StartDrawing(ImageOutput(3))
 
                For i = 0 To 360
                        y_new =  100 * Sin(Radian(i)) + 122
                        LineXY(x_last, y_last, i, y_new, $999999)
                        x_last = i
                        y_last = y_new
                Next
                x_last = 0
                y_last = 100 * Sin(Radian(0)) + 122
                For i = 0 To 360 Step 5
                        y_new = (100-50) * Sin(Radian(i)) + 122
                        LineXY(x_last, y_last, i, y_new, $999999)
                        x_last = i
                        y_last = y_new
                Next
 
        StopDrawing()
;         ImageGadget(4, 40, 20, 530, 260, ImageID(3))
    EndIf
       
        Repeat
                Event = WaitWindowEvent()
               
                If Event = #PB_Event_Gadget
                        Select EventGadget()
                                       
                                Case 2
                                        For a = 180 To kon Step -1
                                                If StartDrawing(CanvasOutput(0))
                                                        Box(0, 0, 490, 240, #White)
                                                        DrawImage(ImageID(3) , 0, 0)                                           
                                                       
                                                        ; y_new = (270 - i) / 222 * Sin(j / 5)
                                                        x_last = 0
                                                        y_last = 100 * Sin(Radian(0)) + 122
                                                        y_new = 0
                                                        ; LineXY(x_last, y_last, i, y_new, 0) ; К началу графика
                                                        For i = 0 To 360
                                                                If (i > a And i < 180) Or (i > 180 And (i - 180) > a)
                                                                        ;                                                                       y_new = (270) / 222 * Sin(i * #iRad)
                                                                        y_new =  100 * Sin(Radian(i)) + 122
                                                                        LineXY(x_last, y_last, i, y_new, $0000FF)
                                                                        x_last = i
                                                                        y_last = y_new
                                                                Else
                                                                        ;                                                                       y_new = (270-150) / 222 * Sin(i * #iRad)
                                                                        y_new = (100-50) * Sin(Radian(i)) + 122
                                                                        LineXY(x_last, y_last, i, y_new, $0000FF)
                                                                        x_last = i
                                                                        y_last = y_new
                                                                EndIf
                                                        Next
                                                        StopDrawing()
                                                        Delay(10)
;                                                               If StartDrawing(CanvasOutput(0))
;                                                                       Box(0, 0, 490, 240, #White)
;                                                                       StopDrawing()
;                                                               EndIf
;                                                       If a > kon
;                                                               ; очистить нарисованое для следующего кадра, но не в конце, оставив последний кадр.
;                                                               If StartDrawing(CanvasOutput(0))
;                                                                       Box(0, 0, 490, 240, #White)
;                                                                       StopDrawing()
;                                                               EndIf
;                                                       EndIf
 
                                                EndIf
                                        Next
                                        ;                                               x = GetGadgetAttribute(0, #PB_Canvas_MouseX)
                                        ;                                               y = GetGadgetAttribute(0, #PB_Canvas_MouseY)
                                        ;                                               Circle(x, y, 10, RGB(Random(255), Random(255), Random(255)))
                                       
                                Case 1
                                        If StartDrawing(CanvasOutput(0))
                                                Box(0, 0,  490, 240, #White)
                                                StopDrawing()
                                        EndIf
                        EndSelect
                EndIf
               
        Until Event = #PB_Event_CloseWindow
EndIf



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: График анимация
СообщениеДобавлено: Пт май 22, 2020 4:02 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11650
Благодарил (а): 4 раз.
Поблагодарили: 502 раз.
Картинку лучше сделать 24-ех битной, т. к. альфа канал не используется.
Поскольку картинка рисуется на весь канвас, в строке
Код:
1
Box(0, 0, 490, 240, #White)

нет необходимости.

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: График анимация
СообщениеДобавлено: Сб май 23, 2020 1:18 pm 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 615
Благодарил (а): 42 раз.
Поблагодарили: 80 раз.
Пункты репутации: 2
Итог. Сделал, чтобы при переключении графика в другую волну линия была вертикальная.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
EnableExplicit
 
Enumeration
        #Canvas_Graf
        #btnStart
        #btnClear
        #ImageLayer
EndEnumeration
 
#cdvig = 105 ; сдвиг графика вниз
#nz = 30 ; угол задержки открытия нерегулируемого плеча
#kon = 80 ; конец регулирования высшего напряжения (всегда меньше #nz)
Global y_last.f = #cdvig
Global y.f
Define i, Event
 
Declare _Draw(a)
 
 
If OpenWindow(0, 0, 0, 240, 200, "Управление тиристором", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
 
        ButtonGadget(#btnStart, 60, 160, 70, 27, "Старт")
        ButtonGadget(#btnClear, 140, 160, 70, 27, "Очистить")
        CanvasGadget(#Canvas_Graf, 40, 20, 180, 120, #PB_Canvas_Container)
;       CloseGadgetList()
 
    If CreateImage(#ImageLayer, 180, 120, 24, RGB(255, 255, 255)) And StartDrawing(ImageOutput(#ImageLayer))
 
                For i = 0 To 180
                        y =  -100 * Sin(Radian(i)) + #cdvig
                        LineXY(i-1, y_last, i, y, $cccccc)
                        y_last = y
                Next
                y_last =#cdvig
                For i = 0 To 180
                        y = -50 * Sin(Radian(i)) + #cdvig
                        LineXY(i-1, y_last, i, y, $cccccc)
                        y_last = y
                Next
                LineXY(0, 105, 180, 105, $cccccc)
 
        StopDrawing()
;         ImageGadget(4, 40, 20, 530, 260, ImageID(#ImageLayer))
    EndIf
   
    _Draw(#kon)
       
        Repeat
                Event = WaitWindowEvent()
               
                If Event = #PB_Event_Gadget
                        Select EventGadget()
                                       
                                Case #btnStart
                                        For i = 180 To #kon Step -1
                                                _Draw(i)
                                                Delay(30)
                                        Next
                                Case #btnClear
                                        If StartDrawing(CanvasOutput(#Canvas_Graf))
                                                Box(0, 0,  490, 240, #White)
                                                StopDrawing()
                                        EndIf
                        EndSelect
                EndIf
               
        Until Event = #PB_Event_CloseWindow
EndIf
 
 
 
Procedure _Draw(a)
        Protected i
        If StartDrawing(CanvasOutput(#Canvas_Graf))
                DrawImage(ImageID(#ImageLayer) , 0, 0) ; рисует фоновый
;               DrawImage(ImageID(#ImageLayer) , 180, 0) ; вариант если надо будет делать 2 полуволны
                LineXY(0, #cdvig, #nz, #cdvig, $0000FF) ; горизонтальная линия, задержка открытия нерегулируемого плеча, чтобы дать закрыть открытые тиристоры
;               Если i = #nz (первый шаг ,делаем ровно вертикально)
                y = -50 * Sin(Radian(#nz)) + #cdvig
                LineXY(#nz, #cdvig, #nz, y, $0000FF)
                y_last = y
                For i = #nz+1 To 180
                        If i = a ; граница перехода ровно вертикально
                                y = -100 * Sin(Radian(i)) + #cdvig
                                LineXY(i, y_last, i, y, $0000FF)
                                y_last = y
                        ElseIf i < a ; низшая полуволна напряжения
                                y = -50 * Sin(Radian(i)) + #cdvig
                                LineXY(i-1, y_last, i, y, $0000FF)
                                y_last = y
                        Else ; иначе высшая полуволна напряжения
                                y =  -100 * Sin(Radian(i)) + #cdvig
                                LineXY(i-1, y_last, i, y, $0000FF)
                                y_last = y
                        EndIf
;                       FillArea(90, 90, -1, $DDDDFF)
;                       FillArea(90, 90, $0000FF, $DDDDFF)
                Next
                StopDrawing()
        EndIf
EndProcedure



Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 14


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB