Difference between revisions of "Math.distance"

From GiderosMobile
Line 55: Line 55:
  
 
-- tests
 
-- tests
 +
local sqrt = math.sqrt
 +
 
local data = {
 
local data = {
 
{
 
{
 
"sqrt",
 
"sqrt",
 
function()
 
function()
local sqrt = math.sqrt
 
 
dx, dy = x2-x1, y2-y1
 
dx, dy = x2-x1, y2-y1
 
dist = sqrt(dx*dx + dy*dy)
 
dist = sqrt(dx*dx + dy*dy)
end, -- 65ms
+
end, -- 56ms
 
},
 
},
 
{
 
{
Line 69: Line 70:
 
dx, dy = x2-x1, y2-y1
 
dx, dy = x2-x1, y2-y1
 
dist = (dx^2 + dy^2)^0.5
 
dist = (dx^2 + dy^2)^0.5
end, -- 32ms
+
end, -- 40ms
 
},
 
},
 
{
 
{
Line 76: Line 77:
 
dx, dy = x2-x1, y2-y1
 
dx, dy = x2-x1, y2-y1
 
dist = (dx*dx + dy*dy)^0.5
 
dist = (dx*dx + dy*dy)^0.5
end, -- 35ms
+
end, -- 43ms
 
},
 
},
 
{
 
{
Line 83: Line 84:
 
dx, dy = x2-x1, y2-y1
 
dx, dy = x2-x1, y2-y1
 
dist = dx*dx + dy*dy
 
dist = dx*dx + dy*dy
end, -- 33ms
+
end, -- 40ms but wrong result!
 
},
 
},
 
{
 
{
Line 89: Line 90:
 
function()
 
function()
 
dist = math.distance(x1, y1, x2, y2)
 
dist = math.distance(x1, y1, x2, y2)
end, -- 70ms
+
end, -- 73ms
 
},
 
},
 
}
 
}
Line 106: Line 107:
  
 
--[[ RESULTS
 
--[[ RESULTS
*** POINT A: -83344 -2060 POINT B: 39448 23210
+
*** POINT A: -95201 388 POINT B: -75997 76396
*** DISTANCE: 125365.25899945328
+
*** DISTANCE: 78396.49022756057
sqrt (73ms) distance: 125365.25899945328
+
sqrt (56ms) distance: 78396.49022756057
exponent (40ms) distance: 125365.25899945328
+
exponent (40ms) distance: 78396.49022756057
multiply/exponent (46ms) distance: 125365.25899945328
+
multiply/exponent (43ms) distance: 78396.49022756057
multiply/exponent without power (43ms) distance: 15716448164
+
multiply/exponent without power (40ms) distance: 6146009680
math.distance (74ms) distance: 125365.25899945328
+
math.distance (73ms) distance: 78396.49022756057
 
]]
 
]]
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
{{Math}}
 
{{Math}}

Revision as of 20:54, 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 tests:

-- simple function timer by @antix
local x1, y1, x2, y2 = math.random(-100000, 100000), math.random(-100000, 100000), math.random(-100000, 100000), math.random(-100000, 100000)
local dx, dy

-- init
local dist = math.distance(x1, y1, x2, y2)
print("*** POINT A: "..x1, y1, "POINT B: "..x2, y2)
print("*** DISTANCE: "..dist)

-- tests
local sqrt = math.sqrt

local data = {
	{
		"sqrt",
		function()
			dx, dy = x2-x1, y2-y1
			dist = sqrt(dx*dx + dy*dy)
		end, -- 56ms
	},
	{
		"exponent",
		function()
			dx, dy = x2-x1, y2-y1
			dist = (dx^2 + dy^2)^0.5
		end, -- 40ms
	},
	{
		"multiply/exponent",
		function()
			dx, dy = x2-x1, y2-y1
			dist = (dx*dx + dy*dy)^0.5
		end, -- 43ms
	},
	{
		"multiply/exponent without power",
		function()
			dx, dy = x2-x1, y2-y1
			dist = dx*dx + dy*dy
		end, -- 40ms but wrong result!
	},
	{
		"math.distance",
		function()
			dist = math.distance(x1, y1, x2, y2)
		end, -- 73ms
	},
}
 
-- run all functions
for i = 1, #data do
	local block = data[i]
	local func = block[2]
	local start = os.timer()
	for i = 1, 1000000 do -- 1 million repetitions!
		func()
	end
	local elapsed = math.floor((os.timer() - start) * 1000)
	print(block[1].." ("..elapsed.."ms)", "", "", "", "", "distance: "..dist)
end

--[[ RESULTS
*** POINT A: -95201	388	POINT B: -75997	76396
*** DISTANCE: 78396.49022756057
sqrt (56ms)					distance: 78396.49022756057
exponent (40ms)					distance: 78396.49022756057
multiply/exponent (43ms)					distance: 78396.49022756057
multiply/exponent without power (40ms)					distance: 6146009680
math.distance (73ms)					distance: 78396.49022756057
]]