Microsoft Small Basic

Program Listing: SCL845
' Calculate Angle C for a Star
' Copyright © 2015 Nonki Takahashi. The MIT License.
'
GraphicsWindow.Title = "How to calculate angle C to draw an N pointed star? - Click to show the next equation "
Not = "True=False;False=True;"
n = 5 ' points
incr = "1=1;2=1;3=4;5=4;6=1;9=4;18=1;" ' increments array for points [degree]
A = 360 / n
Turtle.Speed = 8
If n = 1 Then
Turtle.PenUp()
Turtle.MoveTo(320, 400)
Turtle.Turn(180)
Turtle.PenDown()
EndIf
GraphicsWindow.PenColor = "#80808080"
GraphicsWindow.BrushColor = "DimGray"
' draw pentagon
For i = 1 To n
Turtle.Move(100)
Turtle.Turn(A)
EndFor
' draw a line for A
Turtle.PenUp()
Turtle.Move(100)
Turtle.PenDown()
Turtle.Move(50)
' draw angle A
r = 25
Turtle.PenUp()
Turtle.Turn(180)
Turtle.Move(r)
Turtle.TurnLeft()
Turtle.PenDown()
angle = A
MoveArc()
x = Turtle.X
y = Turtle.Y
GraphicsWindow.DrawText(x - 10, y - 30, "A")
' draw a star
GraphicsWindow.PenColor = "#8000FFFF"
GraphicsWindow.BrushColor = "DarkCyan"
Turtle.TurnRight()
Turtle.PenUp()
Turtle.Move(r)
B = (360 - A) / 4
Turtle.Turn(B - 180)
C = 2 * B
s = 50 / Math.Cos(Math.GetRadians(B))
Turtle.PenDown()
If Math.Remainder(n, 2) = 0 Then
max = 2 * n
Else
max = n
EndIf
For i = 1 To max
Turtle.Move(s)
Turtle.Turn(-C)
EndFor
' draw angle B
Turtle.PenUp()
Turtle.Move(r)
Turtle.TurnLeft()
Turtle.PenDown()
angle = -B
MoveArc()
x = Turtle.X
y = Turtle.Y
GraphicsWindow.DrawText(x + 4, y, "B")
' draw another B
Turtle.PenUp()
Turtle.TurnRight()
Turtle.Move(50)
Turtle.PenDown()
Turtle.TurnRight()
angle = -B
MoveArc()
x = Turtle.X
y = Turtle.Y
GraphicsWindow.DrawText(x - 32, y - 12, "B")
' draw a line for C
Turtle.PenUp()
Turtle.TurnRight()
Turtle.Move(s - r)
Turtle.PenDown()
Turtle.Move(50)
' draw angle C
GraphicsWindow.PenColor = "#80808080"
GraphicsWindow.BrushColor = "DimGray"
Turtle.PenUp()
Turtle.Turn(180)
Turtle.Move(r)
Turtle.TurnLeft()
Turtle.PenDown()
angle = C
MoveArc()
x = Turtle.X
y = Turtle.Y
GraphicsWindow.DrawText(x - 22, y + 16, "C")
' draw angle D
GraphicsWindow.PenColor = "#8000FFFF"
GraphicsWindow.BrushColor = "DarkCyan"
D = 180 - C
angle = D
MoveArc()
x = Turtle.X
y = Turtle.Y
GraphicsWindow.DrawText(x - 14, y - 14, "D")
' draw angle E
GraphicsWindow.PenColor = "#80808080"
GraphicsWindow.BrushColor = "DimGray"
E = 180 - A - B
angle = E
If E < 0 Then
GraphicsWindow.PenColor = "#80FF0000"
GraphicsWindow.BrushColor = "DarkRed"
Turtle.Turn(180)
EndIf
MoveArc()
x = Turtle.X
y = Turtle.Y
GraphicsWindow.DrawText(x - 8, y - 18, "E")
' move Turtle to point A
Turtle.PenUp()
Turtle.Turn(180)
angle = -E
MoveArc()
If E < 0 Then
Turtle.TurnLeft()
Else
Turtle.TurnRight()
EndIf
Turtle.Move(s - 25)
Turtle.Turn(B - 180)
Turtle.Move(100)
Turtle.Turn(-A)
' draw another E
Turtle.Move(25)
Turtle.TurnLeft()
Turtle.PenDown()
If E < 0 Then
Turtle.Turn(180)
EndIf
MoveArc()
x = Turtle.X
y = Turtle.Y
GraphicsWindow.DrawText(x - 6, y + 6, "E")
' back Turtle home
Turtle.PenUp()
If E < 0 Then
Turtle.TurnRight()
Else
Turtle.TurnLeft()
EndIf
Turtle.Move(25)
Turtle.Turn(E - 180)
Turtle.Move(100)
Turtle.Turn(180)
' draw equations
CRLF = Text.GetCharacter(13) + Text.GetCharacter(10)
equ = "A = 360/n … (1)" + CRLF
equ = equ + "A + B + E = 180 … (2)" + CRLF
equ = equ + "C + D = 180 … (3)" + CRLF
equ = equ + "2*B + D = 180 … (4)" + CRLF
equ = equ + "B = D + E … (5)" + CRLF + CRLF
equ = equ + "From (4):" + CRLF
equ = equ + "D = 180 - 2*B … (4')" + CRLF + CRLF
equ = equ + "From (4') and (5):" + CRLF
equ = equ + "B = 180 - 2*B + E" + CRLF
equ = equ + "∴ E = 3*B - 180 … (5')" + CRLF + CRLF
equ = equ + "From (2) and (5'):" + CRLF
equ = equ + "A + B + 3*B - 180 = 180" + CRLF
equ = equ + "A + 4*B = 360" + CRLF
equ = equ + "∴ B = (360 - A)/4 … (2')" + CRLF + CRLF
equ = equ + "From (3) and (4'):" + CRLF
equ = equ + "C + 180 - 2*B = 180" + CRLF
equ = equ + "∴ C = 2*B … (3')" + CRLF + CRLF
equ = equ + "A = " + (Math.Floor(A * 100) / 100) + ", "
equ = equ + "B = " + (Math.Floor(B * 100) / 100) + ", "
equ = equ + "C = " + (Math.Floor(C * 100) / 100) + ", "
equ = equ + "D = " + (Math.Floor(D * 100) / 100) + ", "
equ = equ + "E = " + (Math.Floor(E * 100) / 100) + "[°] while n = " + n
GraphicsWindow.BrushColor = "DimGray"
GraphicsWindow.DrawText(100, 50, equ)
' emphasize equations
em[1] = "x=100;y=50;width=140;height=14.5;"
em[2] = "x=100;y=64.5;width=140;height=14.5;"
em[3] = "x=100;y=79;width=140;height=14.5;"
em[4] = "x=100;y=93.5;width=140;height=14.5;"
em[5] = "x=100;y=108;width=140;height=14.5;"
x = Turtle.X
y = Turtle.Y
_A = Math.GetRadians(A)
' calculate lins for equation (1)
_em = em[1]
_em["xo"] = x
_em["yo"] = y - 100
_em["x1"] = x
_em["y1"] = y - 200
_em["x2"] = _em["xo"] + 100 * Math.Sin(_A)
_em["y2"] = _em["yo"] - 100 * Math.Cos(_A)
em[1] = _em
' calculate lins for equation (2)
_B = Math.GetRadians(B)
_em = em[2]
_em["xo"] = x
_em["yo"] = y - 100
_em["x1"] = x
_em["y1"] = y - 200
_em["x2"] = _em["xo"] + 100 * Math.Sin(_A)
_em["y2"] = _em["yo"] - 100 * Math.Cos(_A)
_em["x3"] = _em["xo"] + 100 * Math.Sin(_A + _B)
_em["y3"] = _em["yo"] - 100 * Math.Cos(_A + _B)
_em["x4"] = x
_em["y4"] = y
em[2] = _em
' calculate lins for equation (3)
_C = Math.GetRadians(C)
_D = Math.GetRadians(D)
_em = em[3]
_em["xo"] = x + s * Math.Sin(_A + _B)
_em["yo"] = y - 100 - s * Math.Cos(_A + _B)
_em["x1"] = _em["xo"] + 100 * Math.Sin(_A + _B - _C)
_em["y1"] = _em["yo"] - 100 * Math.Cos(_A + _B - _C)
_em["x2"] = _em["xo"] + 100 * Math.Sin(_A + _B + Math.Pi)
_em["y2"] = _em["yo"] - 100 * Math.Cos(_A + _B + Math.Pi)
_em["x3"] = _em["xo"] + 100 * Math.Sin(_A + _B + _D)
_em["y3"] = _em["yo"] - 100 * Math.Cos(_A + _B + _D)
em[3] = _em
' calculate lins for equation (4)
_em = em[4]
_em["x1"] = x
_em["y1"] = y - 100
_em["x2"] = _em["x1"] + 100 * Math.Sin(_A)
_em["y2"] = _em["y1"] - 100 * Math.Cos(_A)
_em["x3"] = _em["x1"] + s * Math.Sin(_A + _B)
_em["y3"] = _em["y1"] - s * Math.Cos(_A + _B)
em[4] = _em
' calculate lins for equation (5)
_E = Math.GetRadians(E)
_em = em[5]
_em["xo"] = x + s * Math.Sin(_A + _B)
_em["yo"] = y - 100 - s * Math.Cos(_A + _B)
_em["x1"] = _em["xo"] + 100 * Math.Sin(_A + _B - _C)
_em["y1"] = _em["yo"] - 100 * Math.Cos(_A + _B - _C)
_em["x2"] = _em["xo"] + 100 * Math.Sin(_A + _B + Math.Pi)
_em["y2"] = _em["yo"] - 100 * Math.Cos(_A + _B + Math.Pi)
_em["x3"] = _em["xo"] + 100 * Math.Sin(_A + _B - _C + _E)
_em["y3"] = _em["yo"] - 100 * Math.Cos(_A + _B - _C + _E)
em[5] = _em
nEm = Array.GetItemCount(em)
GraphicsWindow.BrushColor = "#6600FF00"
GraphicsWindow.PenColor = "#6600FF00"
GraphicsWindow.MouseDown = OnMouseDown
While "True"
EmphasizeEquations()
EndWhile
Sub EmphasizeEquations
For i = 1 To nEm
_em = em[i]
GraphicsWindow.PenWidth = 0
_em["obj"] = Shapes.AddRectangle(_em["width"], _em["height"])
Shapes.Move(_em["obj"], _em["x"], _em["y"])
j = 1
GraphicsWindow.PenWidth = 6
If _em["xo"] <> "" Then
While _em["x" + j] <> ""
_em["obj" + j] = Shapes.AddLine(_em["xo"], _em["yo"], _em["x" + j], _em["y" + j])
j = j + 1
EndWhile
Else
While _em["x" + (j + 1)] <> ""
_em["obj" + j] = Shapes.AddLine(_em["x" + j], _em["y" + j], _em["x" + (j + 1)], _em["y" + (j + 1)])
j = j + 1
EndWhile
_em["obj" + j] = Shapes.AddLine(_em["x" + j], _em["y" + j], _em["x1"], _em["y1"])
EndIf
mouseDown = "False"
While Not[mouseDown]
Program.Delay(200)
EndWhile
Shapes.Remove(_em["obj"])
j = 1
While _em["x" + j] <> ""
Shapes.Remove(_em["obj" + j])
j = j + 1
EndWhile
EndFor
EndSub
Sub MoveArc
' param angle [degree]
' param r - radius [pixel]
If incr[n] = "" Then
incr[n] = 0.5
EndIf
_d = 2 * Math.Pi * r / 360 * incr[n] ' distance for incr degree
abs = Math.Abs(angle)
If abs = 0 Then
sgn = 0
Else
sgn = angle / abs
EndIf
For i = 1 To abs / incr[n]
Turtle.Move(_d)
Turtle.Turn(sgn * incr[n])
EndFor
EndSub
Sub OnMouseDown
mouseDown = "True"
EndSub