Microsoft Small Basic

Program Listing: GHR094-0
' mahreen miangul
' Blinking Eyes Drawing
' AugUst 2019
' Modified by Nonki Takahashi for eyes moving

Not["True"] = "False"
Not["False"] = "True"
GraphicsWindow.backgroundcolor= "OliveDrab"
GraphicsWindow.Width = "1080"
GraphicsWindow.Height = "420"

ox[1] = 529
oy[1] = 195
ox[5] = 681
oy[5] = 195
bc[1] = "crimson"
bc[2] = "mediumseagreen"
bc[3] = "dodgerblue"
bc[4] = "yellow"
sz[1] = 150
sz[2] = 110
sz[3] = 80
sz[4] = 50
For i = 5 To 8
sz[i] = sz[i - 4]
bc[i] = bc[i - 4]
EndFor
mx = (ox[1] + ox[5]) / 2
my = (oy[1] + oy[5]) / 2
GraphicsWindow.BrushColor = bc[1]
ell[1] = Shapes.AddEllipse(sz[1], sz[1])
Shapes.Move(ell[1],ox[1] - sz[1] / 2, oy[1] - sz[1] / 2)
ell[5] = Shapes.AddEllipse(sz[5], sz[5])
Shapes.Move(ell[5],ox[5] - sz[5] / 2, oy[5] - sz[5] / 2)
For i = 2 To 4
GraphicsWindow.BrushColor = bc[i]
x = mx - ox[1]
y = my - oy[1]
Math_CartesianToPolar()
d = Math.SquareRoot(x * x + y * y)
If ((d < (sz[1] / 2)) And (d < (sz[1] - sz[i]))) Then
r = d / 2
Else
r = (sz[1] - sz[i]) / 2
EndIf
_a = Math.GetRadians(a)
ox[i] = ox[1] + r * Math.Cos(_a)
oy[i] = oy[1] - r * Math.Sin(_a)
ell[i] = Shapes.AddEllipse(sz[i], sz[i])
Shapes.Move(ell[i], ox[i] - sz[i] / 2, oy[i] - sz[i] / 2)
GraphicsWindow.BrushColor = bc[i + 4]
x = mx - ox[5]
y = my - oy[5]
Math_CartesianToPolar()
d = Math.SquareRoot(x * x + y * y)
If ((d < (sz[5] / 2)) And (d < (sz[5] - sz[i + 4]))) Then
r = d / 2
Else
r = (sz[5] - sz[i + 4]) / 2
EndIf
_a = Math.GetRadians(a)
ox[i + 4] = ox[5] + r * Math.Cos(_a)
oy[i + 4] = oy[5] - r * Math.Sin(_a)
ell[i + 4] = Shapes.AddEllipse(sz[i + 4], sz[i + 4])
Shapes.Move(ell[i + 4], ox[i + 4] - sz[i + 4] / 2, oy[i + 4] - sz[i + 4] / 2)
EndFor
GraphicsWindow.BrushColor = "darkslategray"
rectangle[1] = Shapes.Addrectangle(30, 10)
Shapes.Move(rectangle[1], ox[4] - 30 / 2, oy[4] - 10 / 2)
rectangle[2] = Shapes.Addrectangle(30, 10)
Shapes.Move(rectangle[2], ox[8] - 30 / 2, oy[8] - 10 / 2)

' add eyelids
'GraphicsWindow.PenColor = "transparent
'GraphicsWindow.PenColor = "snow
GraphicsWindow.BrushColor = "OliveDrab"
For i = 1 To 2
eyelids[i] = Shapes.AddEllipse(50, 50)
Shapes.move(eyelids[i], 0, 0)
j = 4 + (i - 1) * 4
Shapes.animate(eyelids[i], ox[j] - sz[j] / 2, oy[j] - sz[j] / 2, 2000)
EndFor
Program.Delay(2000)
Timer.Tick = OnTick
Timer.Interval = 500
moving = "False"
GraphicsWindow.MouseMove = OnMouseMove

Sub OnTick
t = t + 1
If Math.Remainder(t, 8) = 1 Then
For i = 1 To 2
Shapes.HideShape(eyelids[i])
EndFor
ElseIf Math.Remainder(t, 8) = 0 Then
For i = 1 To 2
Shapes.ShowShape(eyelids[i])
EndFor
EndIf
EndSub

Sub OnMouseMove
mx = GraphicsWindow.MouseX
my = GraphicsWindow.MouseY
If Not[moving] Then
moving = "True"
For i = 2 To 4
x = mx - ox[1]
y = my - oy[1]
Math_CartesianToPolar()
d = Math.SquareRoot(x * x + y * y)
If (d < sz[1] / 2) And (d < (sz[1] - sz[i])) Then
r = d / 2
Else
r = (sz[1] - sz[i]) / 2
EndIf
_a = Math.GetRadians(a)
ox[i] = ox[1] + r * Math.Cos(_a)
oy[i] = oy[1] + r * Math.Sin(_a)
Shapes.Move(ell[i], ox[i] - sz[i] / 2, oy[i] - sz[i] / 2)
x = mx - ox[5]
y = my - oy[5]
Math_CartesianToPolar()
d = Math.SquareRoot(x * x + y * y)
If (d < sz[5] / 2) And (d < (sz[5] - sz[i + 4])) Then
r = d / 2
Else
r = (sz[5] - sz[i + 4]) / 2
EndIf
_a = Math.GetRadians(a)
ox[i + 4] = ox[5] + r * Math.Cos(_a)
oy[i + 4] = oy[5] + r * Math.Sin(_a)
Shapes.Move(ell[i + 4], ox[i + 4] - sz[i + 4] / 2, oy[i + 4] - sz[i + 4] / 2)
EndFor
For i = 1 To 2
j = 4 + (i - 1) * 4
Shapes.Move(rectangle[i], ox[j] - 30 / 2, oy[j] - 10 / 2)
Shapes.Move(eyelids[i], ox[j] - sz[j] / 2, oy[j] - sz[j] / 2)
EndFor
moving = "False"
EndIf
EndSub

Sub Math_CartesianToPolar
' Math | convert Cartesian coodinate to polar coordinate
' param x, y - Cartesian coordinate
' return r, a - polar Coordinate (0<=a<360)
r = Math.SquareRoot(x * x + y * y)
If x = 0 And y > 0 Then
a = 90 ' [degree]
ElseIf x = 0 And y < 0 Then
a = -90
ElseIf x = 0 And y = 0 Then
a = 0
Else
a = Math.ArcTan(y / x) * 180 / Math.Pi
EndIf
' at this point -90<=a<=90
If x < 0 Then
a = a + 180
ElseIf x >= 0 And y < 0 Then
a = a + 360
EndIf
' at this point 0<=a<360
EndSub