Sub CalcColors
color = param["color"]
If color = "Transparent" Then
alpha = "33"
color = "White"
ElseIf Text.GetLength(color) = 9 Then
alpha = Text.GetSubText(color, 2, 2)
color = "#" + Text.GetSubTextToEnd(color, 4)
Else
alpha = "FF"
EndIf
Color_NameToColor()
colorTop = color
rate = 0.2
Color_Blacken()
colorLeft = color
color = colorTop
rate = 0.4
Color_Blacken()
colorRight = color
If alpha <> "FF" Then
colorTop = "#" + alpha + Text.GetSubTextToEnd(colorTop, 2)
colorLeft = "#" + alpha + Text.GetSubTextToEnd(colorLeft, 2)
colorRight = "#" + alpha + Text.GetSubTextToEnd(colorRight, 2)
EndIf
EndSub
Sub CalcVertex
' Calcurate vertex between line p1-p2 and line p3-p4
a = p1["x"] * p2["y"] - p1["y"] * p2["x"]
b = p1["y"] - p2["y"]
c = p1["x"] - p2["x"]
d = p3["x"] * p4["y"] - p3["y"] * p4["x"]
e = p3["y"] - p4["y"]
f = p3["x"] - p4["x"]
If b = 0 Then
p["y"] = a / c
p["x"] = (f * p["y"] - d) / e
ElseIf c = 0 Then
p["x"] = -a / b
p["y"] = (e * p["x"] + d) / f
Else
p["x"] = ((a * f) - (c * d)) / ((c * e) - (b * f))
p["y"] = (a + b * p["x"]) / c
EndIF
EndSub
Sub StackCube
' param["x"], param["y"], param["z"] - start corner of the cube
' param["size"] - size of the cube
size1_3 = param["size"] / 3
For rack = 0 To 2
If rack = 1 Then
n1 = 1
Else
n1 = 0
EndIf
For row = 0 To 2
If row = 1 Then
n1 = n1 + 1
EndIf
For col = 0 To 2
If col = 1 Then
n1 = n1 + 1
EndIf
xx = param["x"] + size1_3 * col
yy = param["y"] + size1_3 * row
zz = param["z"] + size1_3 * rack
If n1 < 2 Then
If size = param["size"] Then
pos = "(" + rack + "," + row + "," + col + ")"
GraphicsWindow.Title = title + " - stacking " + pos + " cubes"
EndIF
If 3 <= size1_3 Then
PushValues()
param["x"] = xx
param["y"] = yy
param["z"] = zz
param["size"] = size1_3
StackCube()
PopValues()
Else
For _z = zz + 1 To zz + size1_3
For _y = yy + 1 To yy + size1_3
For _x = xx + 1 To xx + size1_3
block[_z][_y][_x] = 1
EndFor
EndFor
EndFor
EndIf
EndIf
If col = 1 Then
n1 = n1 - 1
EndIf
EndFor
If row = 1 Then
n1 = n1 - 1
EndIf
EndFor
EndFor
EndSub
Sub Color_Blacken
' Color | Blacken given color
' param color - given color
' param rate - 0..1
' return color - color blackened
Color_NameToColor()
Color_ColorToRGB()
r = Math.Floor(r * (1 - rate))
g = Math.Floor(g * (1 - rate))
b = Math.Floor(b * (1 - rate))
color = GraphicsWindow.GetColorFromRGB(r, g, b)
EndSub
Sub Color_ColorToRGB
' Color | Convert color to RGB values
' param color - "#rrggbb" (hexadecimal values)
' return r, g, b - RGB values 0..255
sR = Text.GetSubText(color, 2, 2)
sG = Text.GetSubText(color, 4, 2)
sB = Text.GetSubText(color, 6, 2)
hex = sR
Math_Hex2Dec()
r = dec
hex = sG
Math_Hex2Dec()
g = dec
hex = sB
Math_Hex2Dec()
b = dec
EndSub
Sub Color_NameToColor
' Color | Convert color name to color
' param color - color name
' returns color -"#rrggbb"
If Text.StartsWith(color, "#") And 6 < Text.GetLength(color) Then
color = Text.ConvertToUpperCase(color)
Else
Stack.PushValue("local", GraphicsWindow.PenColor)
GraphicsWindow.PenColor = color
color = GraphicsWindow.PenColor
GraphicsWindow.PenColor = Stack.PopValue("local")
EndIf
EndSub
Sub Math_Hex2Dec
' Math | Convert hexadecimal to decimal
' param hex
' return dec
dec = 0
len = Text.GetLength(hex)
For ptr = 1 To len
dec = dec * 16 + Text.GetIndexOf("123456789ABCDEF", Text.GetSubText(hex, ptr, 1))
EndFor
EndSub