Code: Select all
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, "Thyristor control", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
ButtonGadget(#btnStart, 60, 160, 70, 27, "Start")
ButtonGadget(#btnClear, 140, 160, 70, 27, "Clear")
CanvasGadget(#Canvas_Graf, 40, 20, 180, 120)
; 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