Microsoft Small Basic

Program Listing: KFD409
' Neon Sign
' Copyright © 2017 Nonki Takahashi. The MIT License.
' Challenge 2017-06
' Last update 2017-06-03

GraphicsWindow.Title = "Neon Sign"
px = 80
py = 90
Init()
pc = "#00F"
S()
M()
A()
L()
L()
AddMask()
NewLine()
pc = "#F0F"
B()
A()
S()
I()
C()
AddMask()
While "True"
phase = phase + 10
If 360 <= phase Then
phase = phase - 360
EndIf
For iMask = 1 To nMask
_p = Math.GetRadians(phase - (iMask - 1) * 45)
opacity = 50 * Math.Sin(_p) + 50
Shapes.SetOpacity(mask[iMask], opacity)
EndFor
Program.Delay(50)
EndWhile

Sub AddMask
nMask = nMask + 1
GraphicsWindow.PenWidth = 0
GraphicsWindow.BrushColor = "#000"
mask[nMask] = Shapes.AddRectangle(px - _px, fh)
Shapes.Move(mask[nMask], _px, py)
EndSub

Sub Arc
' param ox, oy - center
' param rx, ry - radius
' param pw - pen width
' param pc - pen color
' param a1, a2 - angle
If a1 < a2 Then
da = 2
Else
da = -2
EndIf
GraphicsWindow.BrushColor = pc
GraphicsWindow.PenWidth = pw
GraphicsWindow.PenColor = pc
For angle = a1 To a2 Step da
_a = Math.GetRadians(angle)
x2 = ox + rx * Math.Cos(_a)
y2 = oy + ry * Math.Sin(_a)
If angle = a1 Then
GraphicsWindow.FillEllipse(x2 - pw / 2, y2 - pw / 2, pw, pw)
Else
GraphicsWindow.DrawLine(x1, y1, x2, y2)
GraphicsWindow.FillEllipse(x2 - pw / 2, y2 - pw / 2, pw, pw)
EndIf
x1 = x2
y1 = y2
EndFor
EndSub

Sub Init
gw = 598
gh = 428
GraphicsWindow.Width = gw
GraphicsWindow.Height = gh
GraphicsWindow.BackgroundColor = "#000"
fh = 100
fw = 70
pw = 6
gap = 20
_px = px
EndSub

Sub NewLine
px = _px
py = py + fh + gap
EndSub

Sub A
GraphicsWindow.BrushColor = pc
GraphicsWindow.FillEllipse(px, py + fh - pw, pw, pw)
GraphicsWindow.PenWidth = pw
GraphicsWindow.PenColor = pc
GraphicsWindow.FillEllipse(px + fw / 2 - pw / 2, py, pw, pw)
GraphicsWindow.DrawLine(px + pw / 2, py + fh - pw / 2, px + fw / 2, py + pw / 2)
GraphicsWindow.DrawLine(px + fw / 2, py + pw / 2, px + fw - pw / 2, py + fh - pw / 2)
GraphicsWindow.FillEllipse(px + fw - pw, py + fh - pw, pw, pw)
oy = py + fh / 2 + ry
GraphicsWindow.FillEllipse(px + pw * 4 - pw / 2, oy - pw / 2, pw, pw)
GraphicsWindow.FillEllipse(px + fw - pw * 4 - pw / 2, oy - pw / 2, pw, pw)
GraphicsWindow.DrawLine(px + pw * 4, oy, px + fw - pw * 4, oy)
px = px + fw + gap
EndSub

Sub B
rx = fw / 2 - pw / 2
ry = (fh / 2 - pw / 2) / 2
ox = px + fw / 2
oy = py + ry + pw / 2
a1 = 45
a2 = -90
Arc()
GraphicsWindow.PenWidth = pw
GraphicsWindow.PenColor = pc
GraphicsWindow.BrushColor = pc
GraphicsWindow.DrawLine(px + fw / 2, py + pw / 2, px + pw / 2, py + pw / 2)
GraphicsWindow.FillEllipse(px, py, pw, pw)
GraphicsWindow.DrawLine(px + pw / 2, py + pw / 2, px + pw / 2, py + fh - pw / 2)
GraphicsWindow.FillEllipse(px, py + fh - pw, pw, pw)
GraphicsWindow.DrawLine(px + fw / 2, py + fh - pw / 2, px + pw / 2, py + fh - pw / 2)
oy = py + fh / 2 + ry
a1 = 90
a2 = -90
Arc()
GraphicsWindow.FillEllipse(px + pw * 3 / 2, py + fh / 2 - pw / 2, pw, pw)
GraphicsWindow.DrawLine(px + pw * 2, py + fh / 2, px + fw / 2, py + fh / 2)
px = px + fw + gap
EndSub

Sub C
rx = fw / 2 - pw / 2
ry = (fh / 2 - pw / 2) / 2
ox = px + fw / 2
oy = py + ry + pw / 2
a1 = 0
a2 = -180
Arc()
GraphicsWindow.PenWidth = pw
GraphicsWindow.PenColor = pc
GraphicsWindow.DrawLine(ox - rx, oy, ox - rx, py + fh / 2 + ry)
oy = py + fh / 2 + ry
a1 = -180
a2 = -360
Arc()
px = px + fw + gap
EndSub

Sub D
EndSub

Sub E
GraphicsWindow.BrushColor = pc
GraphicsWindow.FillEllipse(px, py, pw, pw)
GraphicsWindow.FillEllipse(px, py + fh - pw, pw, pw)
GraphicsWindow.PenWidth = pw
GraphicsWindow.PenColor = pc
GraphicsWindow.DrawLine(px + pw / 2, py + pw / 2, px + pw / 2, py + fh - pw / 2)
GraphicsWindow.FillEllipse(px + fw - pw, py, pw, pw)
GraphicsWindow.DrawLine(px + pw / 2, py + pw / 2, px + fw - pw / 2, py + pw / 2)
GraphicsWindow.FillEllipse(px + pw * 3 / 2, py + fh / 2 - pw / 2, pw, pw)
GraphicsWindow.FillEllipse(px + fw - pw, py + fh / 2 - pw / 2, pw, pw)
GraphicsWindow.DrawLine(px + pw * 2, py + fh / 2, px + fw - pw / 2, py + fh / 2)
GraphicsWindow.FillEllipse(px + fw - pw, py + fh - pw, pw, pw)
GraphicsWindow.DrawLine(px + pw / 2, py + fh - pw / 2, px + fw - pw / 2, py + fh - pw / 2)
px = px + fw + gap
EndSub

Sub F
EndSub

Sub G
rx = fw / 2 - pw / 2
ry = (fh / 2 - pw / 2) / 2
ox = px + fw / 2
oy = py + ry + pw / 2
a1 = 0
a2 = -180
Arc()
GraphicsWindow.PenWidth = pw
GraphicsWindow.PenColor = pc
GraphicsWindow.DrawLine(ox - rx, oy, ox - rx, py + fh / 2 + ry)
oy = py + fh / 2 + ry
a1 = -180
a2 = -360
Arc()
GraphicsWindow.PenWidth = pw
GraphicsWindow.PenColor = pc
GraphicsWindow.DrawLine(ox + rx, oy, ox + rx, py + fh / 2)
GraphicsWindow.FillEllipse(ox - pw / 2, py + fh / 2 - pw / 2, pw, pw)
GraphicsWindow.FillEllipse(ox + rx - pw / 2, py + fh / 2 - pw / 2, pw, pw)
GraphicsWindow.DrawLine(ox, py + fh / 2, ox + fw / 2 - pw / 2, py + fh / 2)
px = px + fw + gap
EndSub

Sub H
EndSub

Sub I
GraphicsWindow.BrushColor = pc
GraphicsWindow.FillEllipse(px, py, pw, pw)
GraphicsWindow.FillEllipse(px, py + fh - pw, pw, pw)
GraphicsWindow.PenWidth = pw
GraphicsWindow.PenColor = pc
GraphicsWindow.DrawLine(px + pw / 2, py + pw / 2, px + pw / 2, py + fh - pw / 2)
px = px + pw + gap
EndSub

Sub J
EndSub

Sub K
EndSub

Sub L
GraphicsWindow.BrushColor = pc
GraphicsWindow.FillEllipse(px, py, pw, pw)
GraphicsWindow.FillEllipse(px, py + fh - pw, pw, pw)
GraphicsWindow.PenWidth = pw
GraphicsWindow.PenColor = pc
GraphicsWindow.DrawLine(px + pw / 2, py + pw / 2, px + pw / 2, py + fh - pw / 2)
GraphicsWindow.FillEllipse(px + fw - pw, py + fh - pw, pw, pw)
GraphicsWindow.DrawLine(px + pw / 2, py + fh - pw / 2, px + fw - pw / 2, py + fh - pw / 2)
px = px + fw + gap
EndSub

Sub M
GraphicsWindow.BrushColor = pc
GraphicsWindow.FillEllipse(px, py, pw, pw)
GraphicsWindow.FillEllipse(px, py + fh - pw, pw, pw)
GraphicsWindow.PenWidth = pw
GraphicsWindow.PenColor = pc
GraphicsWindow.DrawLine(px + pw / 2, py + pw / 2, px + pw / 2, py + fh - pw / 2)
GraphicsWindow.FillEllipse(px + fw / 2 - pw / 2, py + fh - pw, pw, pw)
GraphicsWindow.DrawLine(px + pw / 2, py + pw / 2, px + fw / 2, py + fh - pw / 2)
GraphicsWindow.DrawLine(px + fw / 2, py + fh - pw / 2, px + fw - pw / 2, py + pw / 2)
GraphicsWindow.FillEllipse(px + fw - pw, py, pw, pw)
GraphicsWindow.FillEllipse(px + fw - pw, py + fh - pw, pw, pw)
GraphicsWindow.DrawLine(px + fw - pw / 2, py + pw / 2, px + fw - pw / 2, py + fh - pw / 2)
px = px + fw + gap
EndSub

Sub N
GraphicsWindow.BrushColor = pc
GraphicsWindow.FillEllipse(px, py, pw, pw)
GraphicsWindow.FillEllipse(px, py + fh - pw, pw, pw)
GraphicsWindow.PenWidth = pw
GraphicsWindow.PenColor = pc
GraphicsWindow.DrawLine(px + pw / 2, py + pw / 2, px + pw / 2, py + fh - pw / 2)
GraphicsWindow.FillEllipse(px + fw - pw, py, pw, pw)
GraphicsWindow.FillEllipse(px + fw - pw, py + fh - pw, pw, pw)
GraphicsWindow.DrawLine(px + fw - pw / 2, py + pw / 2, px + fw - pw / 2, py + fh - pw / 2)
GraphicsWindow.DrawLine(px + pw / 2, py + pw / 2, px + fw - pw / 2, py + fh - pw / 2)
px = px + fw + gap
EndSub

Sub O
rx = fw / 2 - pw / 2
ry = (fh / 2 - pw / 2) / 2
ox = px + fw / 2
oy = py + ry + pw / 2
a1 = -30
a2 = -180
Arc()
GraphicsWindow.PenWidth = pw
GraphicsWindow.PenColor = pc
GraphicsWindow.DrawLine(ox - rx, oy, ox - rx, py + fh / 2 + ry)
oy = py + fh / 2 + ry
a1 = -180
a2 = -360
Arc()
GraphicsWindow.PenWidth = pw
GraphicsWindow.PenColor = pc
GraphicsWindow.DrawLine(ox + rx, oy, ox + rx, py + ry + pw / 2)
GraphicsWindow.BrushColor = pc
GraphicsWindow.FillEllipse(ox + rx - pw / 2, py + ry, pw, pw)
px = px + fw + gap
EndSub

Sub P
EndSub

Sub Q
EndSub

Sub R
EndSub

Sub S
rx = fw / 2 - pw / 2
ry = (fh / 2 - pw / 2) / 2
ox = px + fw / 2
oy = py + ry + pw / 2
a1 = 0
a2 = -270
Arc()
oy = py + fh / 2 + ry
a1 = -90
a2 = 180
Arc()
px = px + fw + gap
EndSub

Sub T
EndSub

Sub U
EndSub

Sub V
EndSub

Sub W
EndSub

Sub X
EndSub

Sub Y
EndSub

Sub Z
EndSub