Difference between revisions of "Math.distance"

From GiderosMobile
m (Text replacement - "</source>" to "</syntaxhighlight>")
Line 39: Line 39:
 
end
 
end
 
end
 
end
 +
end
 +
</syntaxhighlight>
 +
 +
=== Alternatives ===
 +
The math.distance may not be the fastest. Here are some alternatives:
 +
<syntaxhighlight lang="lua">
 +
-- simple function timer by @antix
 +
local REPS = 1000000
 +
 +
local dx, dy = 5, 5
 +
 +
local data = {
 +
{
 +
"sqrt",
 +
function()
 +
local sqrt = math.sqrt
 +
local dist = sqrt(dx * dx + dy * dy)
 +
end, -- 43ms
 +
},
 +
{
 +
"exponent",
 +
function()
 +
local dist = ((dx ^ 2) + (dy ^ 2)) ^ 0.5
 +
end, -- 14ms
 +
},
 +
{
 +
"multiply/exponent",
 +
function()
 +
local dist = ((dx * dx) + (dy * dy)) ^ 0.5
 +
end, -- 12ms
 +
},
 +
{
 +
"multiply/exponent without power",
 +
function()
 +
local dist = (dx * dx) + (dy * dy)
 +
end, -- 12ms
 +
},
 +
{
 +
"math.distance",
 +
function()
 +
local dist = math.distance(dx, dy, dx, dy)
 +
end, -- 65ms
 +
},
 +
}
 +
 +
-- run all functions
 +
for i = 1, #data do
 +
local block = data[i]
 +
local func = block[2]
 +
local start = os.timer()
 +
for i = 1, REPS do func() end
 +
local elapsed = math.floor((os.timer() - start) * 1000)
 +
print(block[1] .. " (" .. elapsed .. "ms)")
 
end
 
end
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
{{Math}}
 
{{Math}}

Revision as of 13:42, 28 October 2024

Available since: Gideros 2020.9
Class: math

Description

Returns the distance betwen two points.

(number) = math.distance(x1,y1,z1,x2,y2,z2)
(number) = math.distance({x1,y1,z1},{x2,y2,z2})
(number) = math.distance({x=x1,y=y1,z=z1},{x=x2,y=y2,z=z2})

Note: the number will always be a positive number

Parameters

x1: (number) X component of the first point
y1: (number) Y component of the first point
z1: (number) Z component of the first point optional
x2: (number) X component of the second point
y2: (number) Y component of the second point
z2: (number) Z component of the second point optional

Return values

Returns (number) the distance between the two points (always positive)

Example

local mydist = 256
function LevelX:onEnterFrame(e)
	-- player position
	posx, posy = self.player1.body:getPosition()
	-- for perfs
	for k, v in pairs(self.myobjects) do -- k=sprite, v=box2d body
		local x1, y1 = v:getPosition()
		if math.distance(x1, y1, posx, posy) > mydist then
			k:setVisible(false)
		else
			k:setVisible(true)
		end
	end
end

Alternatives

The math.distance may not be the fastest. Here are some alternatives:

-- simple function timer by @antix
local REPS = 1000000

local dx, dy = 5, 5

local data = {
	{
		"sqrt",
		function()
			local sqrt = math.sqrt
			local dist = sqrt(dx * dx + dy * dy)
		end, -- 43ms
	},
	{
		"exponent",
		function()
			local dist = ((dx ^ 2) + (dy ^ 2)) ^ 0.5
		end, -- 14ms
	},
	{
		"multiply/exponent",
		function()
			local dist = ((dx * dx) + (dy * dy)) ^ 0.5
		end, -- 12ms
	},
	{
		"multiply/exponent without power",
		function()
			local dist = (dx * dx) + (dy * dy)
		end, -- 12ms
	},
	{
		"math.distance",
		function()
			local dist = math.distance(dx, dy, dx, dy)
		end, -- 65ms
	},
}
 
-- run all functions
for i = 1, #data do
	local block = data[i]
	local func = block[2]
	local start = os.timer()
	for i = 1, REPS do func() end
	local elapsed = math.floor((os.timer() - start) * 1000)
	print(block[1] .. " (" .. elapsed .. "ms)")
end