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() | ||
− | |||
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, -- | + | 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, -- | + | 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, -- | + | 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, -- | + | 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, -- | + | end, -- 73ms |
}, | }, | ||
} | } | ||
Line 106: | Line 107: | ||
--[[ RESULTS | --[[ RESULTS | ||
− | *** POINT A: - | + | *** POINT A: -95201 388 POINT B: -75997 76396 |
− | *** DISTANCE: | + | *** DISTANCE: 78396.49022756057 |
− | sqrt ( | + | sqrt (56ms) distance: 78396.49022756057 |
− | exponent (40ms) distance: | + | exponent (40ms) distance: 78396.49022756057 |
− | multiply/exponent ( | + | multiply/exponent (43ms) distance: 78396.49022756057 |
− | multiply/exponent without power ( | + | multiply/exponent without power (40ms) distance: 6146009680 |
− | math.distance ( | + | math.distance (73ms) distance: 78396.49022756057 |
]] | ]] | ||
</syntaxhighlight> | </syntaxhighlight> | ||
{{Math}} | {{Math}} |
Latest 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
]]
- Math
- Math.abs
- Math.acos
- Math.asin
- Math.atan
- Math.atan2
- Math.ceil
- Math.clamp
- Math.cos
- Math.cosh
- Math.cross
- Math.deg
- Math.distance
- Math.distances
- Math.dot
- Math.edge
- Math.exp
- Math.fft
- Math.floor
- Math.fmod
- Math.frexp
- Math.ifft
- Math.inside
- Math.ldexp
- Math.length
- Math.log
- Math.log10
- Math.max
- Math.min
- Math.modf
- Math.nearest
- Math.noise
- Math.normalize
- Math.pow
- Math.rad
- Math.random
- Math.randomseed
- Math.raycast
- Math.round
- Math.sign
- Math.sin
- Math.sinh
- Math.sqrt
- Math.tan
- Math.tanh