Vetores 3D & Metatables (em Lua)

mail@pastecode.io avatar
unknown
lua
2 years ago
1.3 kB
6
Indexable
Never
-- declarando a função aqui para usar dentro da metatable
function criarVertice(x, y, z) end

-- agora para a metatable
local table_Vertices = {
	-- Soma: v_1 + v_2
	__add = function(a, b)
		return criarVertice(
			a.x + b.x,
			a.y + b.y,
			a.z + b.z
		)
	end,

	-- Subtração: v_1 - v_2
	__sub = function(a, b)
		return criarVertice(
			a.x - b.x,
			a.y - b.y,
			a.z - b.z
		)
	end,
	-- Multiplicação: v_1 * v_2
	__mul = function(a, b)
		return (a.x * b.x) + (a.y * b.y) + (a.z * b.z)
	end,
}

function criarVertice(x, y, z)
	local v = {
		x = x or 0,
		y = y or 0,
		z = z or 0,
	}

	setmetatable(v, table_Vertices)
	-- Dependendo da situação é bom fazer sem passar por referência:
	-- local v = setmetatable(v, table_Vertices)
	
	return v
end

os.execute("cls||clear") --Limpa tela em Unix ou Windows

a = criarVertice(10, 5, 15)
b = criarVertice(5, 5)

c = a + b
print(c.x, c.y, c.z)
print("👆️ Soma\n")

c = a - b
print(c.x, c.y, c.z)
print("👆️ Subtração\n")

c = a * b
print(c, "\n👆️ Multiplicação\n")


-- Bem, o que aconteceu?
--
-- Simples, só modificamos a propriedade de '+' (__add, soma), '-'(__sub, subtração) e '*' (__mul, multiplicação) de
-- todas as tables de Vérties.