aboutsummaryrefslogtreecommitdiff
path: root/advtrains/helpers.lua
diff options
context:
space:
mode:
authorywang <yw05@forksworld.de>2019-12-07 16:48:19 +0100
committerywang <yw05@forksworld.de>2019-12-07 16:48:19 +0100
commita404f83ebb6aa26b16e56debc2d6d86f52df680e (patch)
treea9b368598609793a6a2f5bf44cf1c04449ab55c7 /advtrains/helpers.lua
parent45f5406e7ebf22f0c2594c8e8a4e734cc23479b7 (diff)
downloadadvtrains-a404f83ebb6aa26b16e56debc2d6d86f52df680e.tar.gz
advtrains-a404f83ebb6aa26b16e56debc2d6d86f52df680e.tar.bz2
advtrains-a404f83ebb6aa26b16e56debc2d6d86f52df680e.zip
Improved quadratic function solver; added wrapper for math.sqrt()
Diffstat (limited to 'advtrains/helpers.lua')
-rw-r--r--advtrains/helpers.lua11
1 files changed, 10 insertions, 1 deletions
diff --git a/advtrains/helpers.lua b/advtrains/helpers.lua
index a2eabb5..9afe72d 100644
--- a/advtrains/helpers.lua
+++ b/advtrains/helpers.lua
@@ -398,13 +398,22 @@ function advtrains.decode_pos(pts)
return vector.new(dec(strx), dec(stry), dec(strz))
end
+-- Solve quadratic equations (i.e. a*x^2 + b*x + c = 0)
function advtrains.solve_quadratic_equation(a, b, c)
if not (a and b and c) then return nil end
+ if a == 0 then return {-c/b, -c/b} end -- avoid division by zero
local delta = (b*b - 4*a*c)
- if delta < 0 then return nil end
+ if delta < 0 then return {-b/2/a,-b/2/a} end -- ignore imaginary part
return {((-b+math.sqrt(delta))/2/a),((-b-math.sqrt(delta))/2/a)}
end
+-- safe square root
+-- Negative return values indicate imaginary numbers.
+function advtrains.safesqrt(a)
+ if a >= 0 then return math.sqrt(a) end
+ return 0 - math.sqrt(-a)
+end
+
--[[ Benchmarking code
local tdt = {}
local tlt = {}