Microsoft Small Basic

Program Listing: VRZ081
' Solitair Marbles Art
' Version 0.1
' Copyright © 2014-2016 Nonki Takahashi. The MIT License.
' Last update 2016-03-14
' Ported from KFJ748-2
'
GraphicsWindow.Title = "Solitair Marbles Art"
gw = 600
gh = 600
GraphicsWindow.Width = gw
GraphicsWindow.Height = gh
xo = 420
yo = 640
dark = GraphicsWindow.GetColorFromRGB(239, 148, 80)
light = GraphicsWindow.GetColorFromRGB(244, 182, 136)
GraphicsWindow.BackgroundColor = dark
GraphicsWindow.PenColor = "Black"
GraphicsWindow.BrushColor = "#00000000"
s = 30 ' ball size
f = (s * 17 - s * 15) / 2
For d = s * 17 To s * 15 Step -2
u = ((d - s * 15) - f) / f
v = 1 - Math.SquareRoot(1 - u * u)
o = v * 30
e = Shapes.AddEllipse(d, d)
Shapes.SetOpacity(e, o)
Shapes.Move(e, (gw - d) / 2, (gh - d) / 2)
EndFor
f = s - 2
For y = gh / 2 - s * 6.5 To gh / 2 + s * 5.5 Step s * 2
dy = (y + s / 2) - gh / 2
For x = gw / 2 - s * 6.5 To gw / 2 + s * 5.5 Step s * 2
dx = (x + s / 2) - gw / 2
r = Math.SquareRoot(dx * dx + dy * dy) + s / 2
If r < s * 7.5 Then
a = 0
For d = s To 2 Step -2
u = (d - 2) / f
v = 1 - Math.SquareRoot(1 - u * u)
o = v * 30
e = Shapes.AddEllipse(d, d)
Shapes.SetOpacity(e, o)
Shapes.Move(e, x + a, y + a)
a = a + 1
EndFor
EndIf
EndFor
EndFor
d = 7
ratio = 14 ' vertical / horizontal
For y = 0 To gh - 1
For x = 0 To gw - 1
GetColor()
GraphicsWindow.SetPixel(x, y, medium)
EndFor
EndFor
Sub GetColor
' param x, y - point to get color
nx = x - xo
ny = (y - yo) / ratio
r = Math.Remainder(Math.SquareRoot(nx * nx + ny * ny), d)
half = d / 2
If "True" Then
p = Math.Floor((1 - Math.Power(r / half - 1, 2)) * 100)
Else
If r < half Then
p = Math.Floor(r / half * 100)
Else
p = Math.Floor((d - r) / half * 100)
EndIf
EndIf
MediumColor()
GraphicsWindow.PenColor = medium
EndSub
Sub MediumColor
' param dark, light - given colors
' param p - percentage
' return medium - medium color
For i = 1 To 3
hex = Text.GetSubText(dark, i * 2, 2)
Math_Hex2Dec()
a = dec
hex = Text.GetSubText(light, i * 2, 2)
Math_Hex2Dec()
b = dec
v[i] = Math.Floor(a * (1 - p / 100) + b * p / 100)
EndFor
medium = GraphicsWindow.GetColorFromRGB(v[1], v[2], v[3])
EndSub
Sub Math_Hex2Dec
' Math | Convert hexadecimal to decimal
' param hex - hexadecimal
' return dec - decimal
dec = 0
len = Text.GetLength(hex)
For ptr = 1 To len
dec = dec * 16 + Text.GetIndexOf("0123456789ABCDEF", Text.GetSubText(hex, ptr, 1)) - 1
EndFor
EndSub