-
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathrhodena-curve.lua
122 lines (103 loc) · 2.53 KB
/
rhodena-curve.lua
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
-- Rhodonea Curves by Jakob Kruse
-- https://github.com/jakob-kruse
-- You can read more here https://en.wikipedia.org/wiki/Rose_(mathematics)
local fenster = require('fenster')
local windowSize = 900
local window = fenster.open(windowSize, windowSize, 'Math Roses - R to reset + ESC to exit', 1, 0)
---@param delta number
---@param variant fun(delta:number):number
---@return number
local function generateRoseValue(delta, variant)
return 100 * math.sin(variant(delta))
end
---@param offsetX number
---@param offsetY number
---@param delta number
---@param variant fun(delta:number):number
---@param generator fun(delta:number,variant:fun(delta:number):number):number
local function drawRose(offsetX, offsetY, delta, variant, generator)
local radius = generator(delta, variant)
local x = math.floor(radius * math.cos(delta) + offsetX)
local y = math.floor(radius * math.sin(delta) + offsetY)
x = math.max(0, math.min(windowSize - 1, x))
y = math.max(0, math.min(windowSize - 1, y))
window:set(x, y, 0xffffff)
end
local variantValues = {
---Circle
---@param delta number
---@return number
function(delta)
return delta / delta
end,
---4-leaf rose
---@param delta number
---@return number
function(delta)
return math.sin(delta * 2)
end,
---12-leaf rose
---@param delta number
---@return number
function(delta)
return math.sin(delta * 6)
end,
---Butterfly
---@param delta number
---@return number
function(delta)
return math.sin(delta) + math.sin(delta * 4)
end,
---Biker Glasses
---@param delta number
---@return number
function(delta)
return math.sin(delta) + math.sin(delta * 3)
end,
---Neutron Star
---@param delta number
---@return number
function(delta)
return math.tan(delta)
end,
---Logarithmic Spiral
---@param delta number
---@return number
function(delta)
return math.log(delta)
end,
---@param delta number
---@return number
function(delta)
return math.rad(delta) * 10
end,
---@param delta number
---@return number
function(delta)
return math.fmod(delta, 2)
end,
}
local gridSize = math.ceil(math.sqrt(#variantValues))
local cellSize = windowSize / gridSize
local delta = 1
while window:loop() and not window.keys[27] do
if window.keys[82] then
delta = 1
window:clear()
end
for i = 0, gridSize - 1 do
for j = 0, gridSize - 1 do
local variant = variantValues[i * gridSize + j + 1]
if variant then
drawRose(
i * cellSize + cellSize / 2,
j * cellSize + cellSize / 2,
delta,
variant,
generateRoseValue
)
end
end
end
delta = delta + 0.0005
end