Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Roblox
GitHub Repository: Roblox/luau
Path: blob/master/bench/tests/shootout/qt.lua
2727 views
1
--[[
2
MIT License
3
4
Copyright (c) 2017 Gabriel de Quadros Ligneul
5
6
Permission is hereby granted, free of charge, to any person obtaining a copy
7
of this software and associated documentation files (the "Software"), to deal
8
in the Software without restriction, including without limitation the rights
9
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10
copies of the Software, and to permit persons to whom the Software is
11
furnished to do so, subject to the following conditions:
12
13
The above copyright notice and this permission notice shall be included in all
14
copies or substantial portions of the Software.
15
16
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22
SOFTWARE.
23
]]
24
-- Julia sets via interval cell-mapping (quadtree version)
25
26
local function prequire(name) local success, result = pcall(require, name); return success and result end
27
local bench = script and require(script.Parent.bench_support) or prequire("bench_support") or require("../../bench_support")
28
29
function test()
30
31
--require"julia" local f=f
32
33
local io=io
34
local root,exterior
35
local cx,cy
36
local Rxmin,Rxmax,Rymin,Rymax=-2.0,2.0,-2.0,2.0
37
local white=1.0
38
local black=0.0
39
local gray=0.5
40
local N=0
41
local nE=0
42
local E={}
43
local write=print
44
45
local function output(a1,a2,a3,a4,a5,a6)
46
--[[write(
47
a1 or ""," ",
48
a2 or ""," ",
49
a3 or ""," ",
50
a4 or ""," ",
51
a5 or ""," ",
52
a6 or ""," \n")]]
53
end
54
55
local function imul(xmin,xmax,ymin,ymax)
56
local mm=xmin*ymin
57
local mM=xmin*ymax
58
local Mm=xmax*ymin
59
local MM=xmax*ymax
60
local m,M=mm,mm
61
if m>mM then m=mM elseif M<mM then M=mM end
62
if m>Mm then m=Mm elseif M<Mm then M=Mm end
63
if m>MM then m=MM elseif M<MM then M=MM end
64
return m,M
65
end
66
67
local function isqr(xmin,xmax)
68
local u=xmin*xmin
69
local v=xmax*xmax
70
if xmin<=0.0 and 0.0<=xmax then
71
if u<v then return 0.0,v else return 0.0,u end
72
else
73
if u<v then return u,v else return v,u end
74
end
75
end
76
77
local function f(xmin,xmax,ymin,ymax)
78
local x2min,x2max=isqr(xmin,xmax)
79
local y2min,y2max=isqr(ymin,ymax)
80
local xymin,xymax=imul(xmin,xmax,ymin,ymax)
81
return x2min-y2max+cx,x2max-y2min+cx,2.0*xymin+cy,2.0*xymax+cy
82
end
83
84
local function outside(xmin,xmax,ymin,ymax)
85
local x,y
86
if 0.0<xmin then x=xmin elseif 0.0<xmax then x=0.0 else x=xmax end
87
if 0.0<ymin then y=ymin elseif 0.0<ymax then y=0.0 else y=ymax end
88
return x^2+y^2>4.0
89
end
90
91
local function inside(xmin,xmax,ymin,ymax)
92
return xmin^2+ymin^2<=4.0 and xmin^2+ymax^2<=4.0 and
93
xmax^2+ymin^2<=4.0 and xmax^2+ymax^2<=4.0
94
end
95
96
local function newcell()
97
return {nil,nil,nil,nil,color=gray}
98
end
99
100
local function addedge(a,b)
101
nE=nE+1
102
E[nE]=b
103
end
104
105
local function refine(q)
106
if q.color==gray then
107
if q[1]==nil then
108
q[1]=newcell()
109
q[2]=newcell()
110
q[3]=newcell()
111
q[4]=newcell()
112
else
113
refine(q[1])
114
refine(q[2])
115
refine(q[3])
116
refine(q[4])
117
end
118
end
119
end
120
121
local function clip(q,xmin,xmax,ymin,ymax,o,oxmin,oxmax,oymin,oymax)
122
local ixmin,ixmax,iymin,iymax
123
if xmin>oxmin then ixmin=xmin else ixmin=oxmin end
124
if xmax<oxmax then ixmax=xmax else ixmax=oxmax end
125
if ixmin>=ixmax then return end
126
if ymin>oymin then iymin=ymin else iymin=oymin end
127
if ymax<oymax then iymax=ymax else iymax=oymax end
128
--if ixmin<=ixmax and iymin<=iymax then
129
if iymin<iymax then
130
if q[1]==nil then
131
addedge(o,q)
132
else
133
local xmid=(xmin+xmax)/2.0
134
local ymid=(ymin+ymax)/2.0
135
clip(q[1],xmin,xmid,ymid,ymax,o,oxmin,oxmax,oymin,oymax)
136
clip(q[2],xmid,xmax,ymid,ymax,o,oxmin,oxmax,oymin,oymax)
137
clip(q[3],xmin,xmid,ymin,ymid,o,oxmin,oxmax,oymin,oymax)
138
clip(q[4],xmid,xmax,ymin,ymid,o,oxmin,oxmax,oymin,oymax)
139
end
140
end
141
end
142
143
local function map(q,xmin,xmax,ymin,ymax)
144
--xmin,xmax,ymin,ymax=f(xmin,xmax,ymin,ymax,cx,cy)
145
xmin,xmax,ymin,ymax=f(xmin,xmax,ymin,ymax)
146
if outside(xmin,xmax,ymin,ymax) then
147
q.color=white
148
else
149
if not inside(xmin,xmax,ymin,ymax) then addedge(q,exterior) end
150
clip(root,Rxmin,Rxmax,Rymin,Rymax,q,xmin,xmax,ymin,ymax)
151
end
152
end
153
154
local function update(q,xmin,xmax,ymin,ymax)
155
if q.color==gray then
156
if q[1]==nil then
157
local b=nE
158
q[2]=nE+1
159
map(q,xmin,xmax,ymin,ymax)
160
q[3]=nE
161
else
162
local xmid=(xmin+xmax)/2.0
163
local ymid=(ymin+ymax)/2.0
164
update(q[1],xmin,xmid,ymid,ymax)
165
update(q[2],xmid,xmax,ymid,ymax)
166
update(q[3],xmin,xmid,ymin,ymid)
167
update(q[4],xmid,xmax,ymin,ymid)
168
end
169
end
170
end
171
172
local function color(q)
173
if q.color==gray then
174
if q[1]==nil then
175
for i=q[2],q[3] do
176
if E[i].color~=white then return end
177
end
178
q.color=white N=N+1
179
else
180
color(q[1])
181
color(q[2])
182
color(q[3])
183
color(q[4])
184
end
185
end
186
end
187
188
local function prewhite(q)
189
if q.color==gray then
190
if q[1]==nil then
191
for i=q[2],q[3] do
192
local c=E[i].color
193
if c==white or c==-gray then
194
q.color=-gray
195
N=N+1
196
return
197
end
198
end
199
else
200
prewhite(q[1])
201
prewhite(q[2])
202
prewhite(q[3])
203
prewhite(q[4])
204
end
205
end
206
end
207
208
local function recolor(q)
209
if q.color==-gray then
210
q.color=gray
211
elseif q.color==gray then
212
if q[1]==nil then
213
q.color=black
214
else
215
recolor(q[1])
216
recolor(q[2])
217
recolor(q[3])
218
recolor(q[4])
219
end
220
end
221
end
222
223
local function area(q)
224
if q[1]==nil then
225
if q.color==white then return 0.0,0.0
226
elseif q.color==black then return 0.0,1.0
227
else return 1.0,0.0 end
228
else
229
local g1,b1=area(q[1])
230
local g2,b2=area(q[2])
231
local g3,b3=area(q[3])
232
local g4,b4=area(q[4])
233
return (g1+g2+g3+g4)/4.0, (b1+b2+b3+b4)/4.0
234
end
235
end
236
237
local function colorup(q)
238
if q[1]~=nil and q.color==gray then
239
local c1=colorup(q[1])
240
local c2=colorup(q[2])
241
local c3=colorup(q[3])
242
local c4=colorup(q[4])
243
if c1==c2 and c1==c3 and c1==c4 then
244
if c1~=gray then
245
q[1]=nil; --q[2]=nil; q[3]=nil; q[4]=nil
246
N=N+1 end
247
q.color=c1
248
end
249
end
250
return q.color
251
end
252
253
local function save(q,xmin,ymin,N)
254
if q[1]==nil or N==1 then
255
output(xmin,ymin,N,q.color)
256
else
257
N=N/2
258
local xmid=xmin+N
259
local ymid=ymin+N
260
save(q[1],xmin,ymin,N)
261
save(q[2],xmid,ymin,N)
262
save(q[3],xmin,ymid,N)
263
save(q[4],xmid,ymid,N)
264
end
265
end
266
local function show(p)
267
local N=2^10
268
-- io.output(p..".box")
269
output(N)
270
save(root,0,0,N)
271
-- io.close()
272
end
273
274
local t0=0
275
local function memory(s)
276
local t=os.clock()
277
--local dt=string.format("%f",t-t0)
278
local dt=t-t0
279
--io.stdout:write(s,"\t",dt," sec\t",t," sec\t",math.floor(collectgarbage("count")/1024),"M\n")
280
t0=t
281
end
282
283
local function do_(f,s)
284
local a,b=f(root,Rxmin,Rxmax,Rymin,Rymax)
285
memory(s)
286
return a,b
287
end
288
289
local function julia(l,a,b)
290
memory("begin")
291
cx=a cy=b
292
root=newcell()
293
exterior=newcell() exterior.color=white
294
show(0)
295
for i=1,l do --print("\nstep",i)
296
nE=0
297
do_(refine,"refine")
298
do_(update,"update")
299
repeat
300
N=0 color(root,Rxmin,Rxmax,Rymin,Rymax) --print("color",N)
301
until N==0 memory("color")
302
repeat
303
N=0 prewhite(root,Rxmin,Rxmax,Rymin,Rymax) --print("prewhite",N)
304
until N==0 memory("prewhite")
305
do_(recolor,"recolor")
306
do_(colorup,"colorup") --print("colorup",N)
307
local g,b=do_(area,"area") --print("area",g,b,g+b)
308
show(i) memory("output")
309
--print("edges",nE)
310
end
311
end
312
313
--julia(14,0.25,0.35)
314
--julia(14, -.12, .74 )
315
--julia(14,0,0)
316
--julia(12,0.25,0)
317
--julia(9,0.24,0)
318
--julia(9,0.26,0)
319
--julia(13,0,1)
320
--julia(12,-1.1,0)
321
--julia(9,-0.12,0.5)
322
323
-- figures for paper
324
--julia(14,0,1)
325
--julia(14,-1,0)
326
--julia(12,-0.12, 0.64)
327
--julia(14,-0.12, 0.60)
328
--julia(14,-0.12, 0.30)
329
330
-- julia (level, a, b) -- julia set de c= a + b i
331
julia(8,-0.25, 0.74)
332
333
end
334
335
bench.runCode(test, "qt")
336
337