mirror of
				https://github.com/sbrl/Minetest-WorldEditAdditions
				synced 2025-10-30 11:43:05 +01:00 
			
		
		
		
	this does the maths properly, so we'e going from O(n³) to O(1) :D //subdivide should get started *so much faster* now :D
		
			
				
	
	
		
			77 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
| --[[
 | |
| test_count_chunks
 | |
| 
 | |
| Test script for the new count_chunks implementation for //subdivide.
 | |
| The new implementation does the maths properly and is functionally identical to
 | |
| the previous algorithm - we've tested it with 1000 totally random pos1, pos2,
 | |
| and chunk_size values.
 | |
| ]]--
 | |
| 
 | |
| local function count_chunks(pos1, pos2, chunk_size)
 | |
| 	local count = 0
 | |
| 	for z = pos2.z, pos1.z, -chunk_size.z do
 | |
| 		for y = pos2.y, pos1.y, -chunk_size.y do
 | |
| 			for x = pos2.x, pos1.x, -chunk_size.x do
 | |
| 				count = count + 1
 | |
| 			end
 | |
| 		end
 | |
| 	end
 | |
| 	return count
 | |
| end
 | |
| 
 | |
| local function count_chunks_new(pos1, pos2, chunk_size)
 | |
| 	-- Assume pos1 & pos2 are sorted
 | |
| 	local dimensions = {
 | |
| 		x = pos2.x - pos1.x + 1,
 | |
| 		y = pos2.y - pos1.y + 1,
 | |
| 		z = pos2.z - pos1.z + 1,
 | |
| 	}
 | |
| 	-- print("[new] dimensions", dimensions.x, dimensions.y, dimensions.z)
 | |
| 	return math.ceil(dimensions.x / chunk_size.x)
 | |
| 		* math.ceil(dimensions.y / chunk_size.y)
 | |
| 		* math.ceil(dimensions.z / chunk_size.z)
 | |
| end
 | |
| 
 | |
| 
 | |
| local pos1	= { x = 16000, y = 0, z = 16000 }
 | |
| local pos2	= { x = 16100, y = 100, z = 16100 }
 | |
| local count	= { x = 7, y = 9, z = 10 }
 | |
| 
 | |
| print("Reference: ", count_chunks(pos1, pos2, count))
 | |
| print("New: ", count_chunks_new(pos1, pos2, count))
 | |
| 
 | |
| local ok = 0
 | |
| local failed = false
 | |
| for i=1,1000 do
 | |
| 	pos1.x = 16000 + math.floor(math.random() * 99)
 | |
| 	pos1.y = 16000 + math.floor(math.random() * 99)
 | |
| 	pos1.z = 16000 + math.floor(math.random() * 99)
 | |
| 
 | |
| 	pos2.x = 16100 + math.floor(math.random() * 2000)
 | |
| 	pos2.y = 16100 + math.floor(math.random() * 2000)
 | |
| 	pos2.z = 16100 + math.floor(math.random() * 2000)
 | |
| 	
 | |
| 	count.x = math.floor(math.random() * 25) + 1
 | |
| 	count.y = math.floor(math.random() * 25) + 1
 | |
| 	count.z = math.floor(math.random() * 25) + 1
 | |
| 	
 | |
| 	io.write(ok..": ( "..pos1.x..", "..pos1.y..", "..pos1.z.." ) - ( "..pos2.x..", "..pos2.y..", "..pos2.z.." ), size ( ", count.x, ", ", count.y, ", ", count.z, " ) | ")
 | |
| 	
 | |
| 	local val_ref = count_chunks(pos1, pos2, count)
 | |
| 	local val_new = count_chunks_new(pos1, pos2, count)
 | |
| 	
 | |
| 	if val_ref == val_new then
 | |
| 		print("OK")
 | |
| 		ok = ok + 1
 | |
| 	else
 | |
| 		print("FAIL! ( "..val_ref.." / "..val_new.." )")
 | |
| 		failed = true
 | |
| 		break
 | |
| 	end
 | |
| 	
 | |
| end
 | |
| 
 | |
| io.write(ok.." ok")
 | |
| if failed then io.write(", 1 failed") end
 | |
| print()
 |