Microsoft Small Basic

Program Listing: KWD991
' 3-D Dice
' Version 0.1
' Copyright © 2016 Nonki Takahashi. The MIT License.

title = "3-D Dice 0.1 - Hit any key to continue."
GraphicsWindow.Title = title
Init()
While "True"
eye = Math.GetRandomNumber(6)
a1 = face[eye]["a"]
eye = Math.GetRandomNumber(6)
a2 = face[eye]["a"]
For k = 200 To 0 Step -5
GraphicsWindow.Clear()
a = (k + a1)
b = 2 * (k + a1)
c = -(k + a1)
ox = gw / 2 - scale * 2
DrawDice()
a = (k + a2)
b = 2 * (k + a2)
c = -(k + a2)
ox = gw / 2 + scale * 2
DrawDice()
Program.Delay(30)
EndFor
keyDown = "False"
While Not[keyDown]
Program.Delay(100)
EndWhile
EndWhile
Sub Init
Not = "False=True;True=False;"
gw = 598
gh = 428
GraphicsWindow.Width = gw
GraphicsWindow.Height = gh
ox = gw / 2
oy = gh / 2
scale = 20
pw = 3
GraphicsWindow.PenWidth = pw
' vertices - coordinates
v[1] = "x=-1;y=-1;z=-1;"
v[2] = "x=-1;y=-1;z=1;"
v[3] = "x=-1;y=1;z=-1;"
v[4] = "x=-1;y=1;z=1;"
v[5] = "x=1;y=-1;z=-1;"
v[6] = "x=1;y=-1;z=1;"
v[7] = "x=1;y=1;z=-1;"
v[8] = "x=1;y=1;z=1;"
' faces - set of edges and angle to appear
face[1] = "1=24;2=48;3=86;4=62;x=0;y=0;z=1;a=0;"
face[2] = "1=34;2=48;3=78;4=37;x=0;y=1;z=0;a=270;"
face[3] = "1=56;2=86;3=78;4=75;x=1;y=0;z=0;a=135;"
face[4] = "1=12;2=24;3=34;4=13;x=-1;y=0;z=0;a=225;"
face[5] = "1=12;2=62;3=56;4=51;x=0;y=-1;z=0;a=90;"
face[6] = "1=13;2=37;3=75;4=51;x=0;y=0;z=-1;a=180;"
' dots - coordinates and colors
d[1][1] = "x=0;y=0;z=1;f=1;color=Red;"
d[2][1] = "x=-0.5;y=1;z=0.5;"
d[2][2] = "x=0.5;y=1;z=-0.5;"
d[3][1] = "x=1;y=-0.5;z=0.5;"
d[3][2] = "x=1;y=0;z=0;"
d[3][3] = "x=1;y=0.5;z=-0.5;"
d[4][1] = "x=-1;y=-0.5;z=-0.5;"
d[4][2] = "x=-1;y=-0.5;z=0.5;"
d[4][3] = "x=-1;y=0.5;z=-0.5;"
d[4][4] = "x=-1;y=0.5;z=0.5;"
d[5][1] = "x=-0.5;y=-1;z=-0.5;"
d[5][2] = "x=-0.5;y=-1;z=0.5;"
d[5][3] = "x=0;y=-1;z=0;"
d[5][4] = "x=0.5;y=-1;z=-0.5;"
d[5][5] = "x=0.5;y=-1;z=0.5;"
d[6][1] = "x=-0.5;y=-0.5;z=-1;"
d[6][2] = "x=-0.5;y=0;z=-1;"
d[6][3] = "x=-0.5;y=0.5;z=-1;"
d[6][4] = "x=0.5;y=-0.5;z=-1;"
d[6][5] = "x=0.5;y=0;z=-1;"
d[6][6] = "x=0.5;y=0.5;z=-1;"
GraphicsWindow.KeyDown = OnKeyDown
EndSub
Sub OnKeyDown
keyDown = "True"
EndSub
Sub DrawDice
GraphicsWindow.PenColor = "LightGray"
edge = ""
f = ""
For j = 1 To 6
x = face[j]["x"]
y = face[j]["y"]
z = face[j]["z"]
Mapping()
If "1E-5" < z Then
For i = 1 To j
GraphicsWindow.BrushColor = d[j][i]["color"]
x = d[j][i]["x"]
y = d[j][i]["y"]
z = d[j][i]["z"]
Mapping()
GraphicsWindow.FillEllipse(x - pw / 2, y - pw / 2 , pw, pw)
EndFor
n = 4
For i = 1 To 4
' edges
edge[face[j][i]] = 1
EndFor
EndIf
n = Array.GetItemCount(edge)
iEdge = Array.GetAllIndices(edge)
For i = 1 To n
v1 = Text.GetSubText(iEdge[i], 1, 1)
v2 = Text.GetSubText(iEdge[i], 2, 1)
x = v[v1]["x"]
y = v[v1]["y"]
z = v[v1]["z"]
Mapping()
x1 = x
y1 = y
x = v[v2]["x"]
y = v[v2]["y"]
z = v[v2]["z"]
Mapping()
x2 = x
y2 = y
GraphicsWindow.DrawLine(x1, y1, x2, y2)
EndFor
EndFor
EndSub
Sub Mapping
' param x, y, z - point to map
' param a - angle around x axis
' param b - angle around y axis
' param c - angle around z axis
_a = Math.GetRadians(a)
_y = y
_z = z
y = Math.Cos(_a) * _y - Math.Sin(_a) * _z
z = Math.Sin(_a) * _y + Math.Cos(_a) * _z
_b = Math.GetRadians(b)
_z = z
_x = x
z = Math.Cos(_b) * _z - Math.Sin(_b) * _x
x = Math.Sin(_b) * _z + Math.Cos(_b) * _x
_c = Math.GetRadians(c)
_x = x
_y = y
x = Math.Cos(_c) * _x - Math.Sin(_c) * _y
y = Math.Sin(_c) * _x + Math.Cos(_c) * _y
x = ox + x * scale
y = oy - y * scale
EndSub