Microsoft Small Basic

Program Listing: ZKH816
' Polygon Transformer
' Copyright © 2017 Nonki Takahashi. The MIT License.

GraphicsWindow.Title = "Polygon Transformer"
Init()
DrawGrid()
x = 50
y = 50
f = 100
h = 100
a = (f/50) * (h/50) / 2
GraphicsWindow.FontName = "Trebuchet MS"
GraphicsWindow.BrushColor = "Black"
GraphicsWindow.DrawText(10, 10, "Area = " + a)
GraphicsWindow.BrushColor = "Red"
GraphicsWindow.FillTriangle(x, y, x, y + h, x + f, y + h)
GraphicsWindow.BrushColor = "Black"
GraphicsWindow.DrawText(x + 5, y + 105, "Triangle")
x = x + 150
GraphicsWindow.BrushColor = "Orange"
GraphicsWindow.FillRectangle(x, y, f / 2, h)
GraphicsWindow.BrushColor = "Black"
GraphicsWindow.DrawText(x + 5, y + 105, "Quadrilateral")
x = x + 100
GraphicsWindow.BrushColor = "Gold"
GraphicsWindow.FillRectangle(x, y, f / 4, h)
GraphicsWindow.FillTriangle(x + f / 4, y, x + f / 4, y + h, x + f / 4 + f / 2, y + h / 2)
GraphicsWindow.BrushColor = "Black"
GraphicsWindow.DrawText(x + 5, y + 105, "Pentagon")
x = x + 100
GraphicsWindow.BrushColor = "YellowGreen"
GraphicsWindow.FillTriangle(x + f / 4, y, x + f / 4, y + h, x, y + h / 2)
GraphicsWindow.FillRectangle(x + f / 4, y, f / 4, h)
GraphicsWindow.FillTriangle(x + f / 2, y, x + f / 2, y + h, x + f / 4 + f / 2, y + h / 2)
GraphicsWindow.BrushColor = "Black"
GraphicsWindow.DrawText(x + 5, y + 105, "Hexagon")
x = 50
y = y + 150
GraphicsWindow.BrushColor = "Green"
AddHeptagon()
GraphicsWindow.BrushColor = "Black"
GraphicsWindow.DrawText(x + 5, y + 55, "Heptagon")
x = x + 200
GraphicsWindow.BrushColor = "Teal"
AddOctagon()
GraphicsWindow.BrushColor = "Black"
GraphicsWindow.DrawText(x + 5, y + 55, "Octagon")

Sub AddHeptagon
GraphicsWindow.PenWidth = 0
tb[1] = Shapes.AddTriangle(f / 4, 0, 0, h / 2, f / 2, h / 2)
Shapes.Move(tb[1], x, y)
Shapes.Rotate(tb[1], 180)
tb[2] = Shapes.AddTriangle(f / 4, 0, 0, h / 2, f / 2, h / 2)
Shapes.Move(tb[2], x + f / 4, y)
tb[3] = Shapes.AddTriangle(f / 4, 0, 0, h / 2, f / 2, h / 2)
Shapes.Move(tb[3], x + f / 2, y)
Shapes.Rotate(tb[3], 180)
tr[1] = Shapes.AddTriangle(0, 0, 0, h / 2, f / 4, h / 2)
Shapes.Move(tr[1], x, y)
tl[1] = Shapes.AddTriangle(f / 4, 0, 0, h / 2, f / 4, h / 2)
Shapes.Move(tl[1], x + f * 3 / 4, y)
Program.Delay(1000)
Shapes.Animate(tb[1], x, y - 25, 1000)
Shapes.Animate(tb[3], x + f / 2, y - 25, 1000)
Shapes.Animate(tr[1], x - 25, y, 1000)
Shapes.Animate(tl[1], x + f, y, 1000)
Program.Delay(1000)
θ = 2 * Math.GetDegrees(Math.ArcTan(1 / 2))
_θ = Math.GetRadians(θ)
Δφ = (θ + 90) / 10
For Δθ = 180 + (θ -180) / 10 To θ Step (θ - 180) / 10
Shapes.Rotate(tb[1], Δθ)
Shapes.Rotate(tb[3], -Δθ)
Shapes.Rotate(tr[1], Δφ)
Shapes.Rotate(tl[1], -Δφ)
Δφ = Δφ + (θ + 90) / 10
Program.Delay(100)
EndFor
r = h / 4
xo = x + f / 2 - r * Math.Sin(_θ)
yo = y + r * Math.Cos(_θ)
Shapes.Animate(tb[1], xo - f / 4, yo - h / 4, 1000)
xo = x + f / 2 - r * Math.Sin(-_θ)
yo = y + r * Math.Cos(-_θ)
Shapes.Animate(tb[3], xo - f / 4, yo - h / 4, 1000)
r = h / 2 + f / 8
xo = x + f / 2 - r * Math.Sin(_θ)
yo = y + r * Math.Cos(_θ)
Shapes.Animate(tr[1], xo - f / 8, yo - h / 4, 1000)
xo = x + f / 2 - r * Math.Sin(-_θ)
yo = y + r * Math.Cos(-_θ)
Shapes.Animate(tl[1], xo - f / 8, yo - h / 4, 1000)
EndSub

Sub AddOctagon
GraphicsWindow.PenWidth = 0
tb[1] = Shapes.AddTriangle(f / 4, 0, 0, h / 2, f / 2, h / 2)
Shapes.Move(tb[1], x, y)
Shapes.Rotate(tb[1], 180)
tb[2] = Shapes.AddTriangle(f / 4, 0, 0, h / 2, f / 2, h / 2)
Shapes.Move(tb[2], x + f / 2, y)
tr[1] = Shapes.AddTriangle(0, 0, 0, h / 2, f / 4, h / 2)
Shapes.Move(tr[1], x, y)
tr[2] = Shapes.AddTriangle(0, 0, 0, h / 2, f / 4, h / 2)
Shapes.Move(tr[2], x + f * 3 / 4, y)
Shapes.Rotate(tr[2], 180)
tl[1] = Shapes.AddTriangle(f / 4, 0, 0, h / 2, f / 4, h / 2)
Shapes.Move(tl[1], x + f / 4, y)
tl[2] = Shapes.AddTriangle(f / 4, 0, 0, h / 2, f / 4, h / 2)
Shapes.Move(tl[2], x + f / 2, y)
Shapes.Rotate(tl[2], 180)
Program.Delay(1000)
Shapes.Animate(tb[1], x, y - 25, 1000)
Shapes.Animate(tb[2], x + f / 2, y + 25, 1000)
Shapes.Animate(tr[1], x - 25, y, 1000)
Shapes.Animate(tr[2], x + f, y, 1000)
Program.Delay(1000)
θ = 2 * Math.GetDegrees(Math.ArcTan(1 / 2))
_θ = Math.GetRadians(θ)
Δφ = (θ + 90) / 10
For Δθ = 180 + (θ -180) / 10 To θ Step (θ - 180) / 10
Shapes.Rotate(tb[1], Δθ)
Shapes.Rotate(tb[2], 180 + Δθ)
Shapes.Rotate(tr[1], Δφ)
Shapes.Rotate(tr[2], 180 + Δφ)
Δφ = Δφ + (θ + 90) / 10
Program.Delay(100)
EndFor
r = h / 4
xo = x + f / 2 - r * Math.Sin(_θ)
yo = y + r * Math.Cos(_θ)
Shapes.Animate(tb[1], xo - f / 4, yo - h / 4, 1000)
xo = x + f / 2 + r * Math.Sin(_θ)
yo = y + h / 2 - r * Math.Cos(_θ)
Shapes.Animate(tb[2], xo - f / 4, yo - h / 4, 1000)
r = h / 2 + f / 8
xo = x + f / 2 - r * Math.Sin(_θ)
yo = y + r * Math.Cos(_θ)
Shapes.Animate(tr[1], xo - f / 8, yo - h / 4, 1000)
xo = x + f / 2 + r * Math.Sin(_θ)
yo = y + h / 2 - r * Math.Cos(_θ)
Shapes.Animate(tr[2], xo - f / 8, yo - h / 4, 1000)
EndSub

Sub DrawGrid
GraphicsWindow.PenColor = "Gray"
For x = 0 To gw Step 50
GraphicsWindow.DrawLine(x, 0, x, gh)
EndFor
For y = 0 To gh Step 50
GraphicsWindow.DrawLine(0, y, gw, y)
EndFor
EndSub

Sub Init
gw = 598
gh = 428
GraphicsWindow.Width = gw
GraphicsWindow.Height = gh
EndSub