diff options
author | Norbert Preining <norbert@preining.info> | 2024-03-27 03:02:20 +0000 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2024-03-27 03:02:20 +0000 |
commit | 31fa8cd73bab8480d38dae3a89ca578f337d6bbd (patch) | |
tree | ba550e99e0cb15dbf5405369d536b12b051c5155 /macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_maths.lua | |
parent | 904f56f2c26edc7eb11d5a27579bccbeca29c618 (diff) |
CTAN sync 202403270302
Diffstat (limited to 'macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_maths.lua')
-rw-r--r-- | macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_maths.lua | 186 |
1 files changed, 182 insertions, 4 deletions
diff --git a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_maths.lua b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_maths.lua index 63f5190f02..9b4e51d295 100644 --- a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_maths.lua +++ b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_functions_maths.lua @@ -1,6 +1,6 @@ -- tkz_elements_functions_maths.lua --- date 2024/02/04 --- version 2.00c +-- date 2024/03/25 +-- version 2.20c -- Copyright 2024 Alain Matthes -- This work may be distributed and/or modified under the -- conditions of the LaTeX Project Public License, either version 1.3 @@ -126,8 +126,186 @@ function swap(a,b) b=t return a,b end +-- real func +function is_integer(x) + return x == math.round(x) +end + +function near_integer(x) + local i,r = math.modf (x) + if is_zero (r) then + return true + end + return false +end + +function residue (x) + dp,ip = math.modf (x) + return ip +end + +function is_zero (x) + return math.abs(x) < tkz_epsilon +end + +function set_zero (x) + if is_zero (x) then x=0 end + return x +end + +function math.round(num) + return math.floor(num + 0.5) +end + +function checknumber(x) + if type(x) == 'table' then + return x + else + if string.find(x, "e") then + return string.format("%.12f",x) + else + return x + end + end +end + +function decimal (x) + if string.find(x, "e") then + return string.format("%.12f",x) + else + return x + end +end -function format_number(number, decimal_places) - local format_string = string.format("%%.%df", decimal_places) +function format_number(number, dcpl) + if type(number) == 'table' then return number + else + local format_string = string.format("%%.%df", dcpl) return string.format(format_string, number) + end +end + +function get_sign(number) + local sgn + if math.abs(number) < tkz_epsilon then + sgn = "" + elseif number > 0 then + sgn = "+" + else + sgn = "-" + end + return sgn +end + +function solve_quadratic(a, b, c) + local root1, root2,delta ,sqrtdelta + if (type(a) == "number") and (type(b) == "number") and (type(c) == "number") + then + delta = b*b - 4*a*c + if delta < 0 then + root1, root2 = solve_cx_quadratic(a, b, c) + elseif delta == 0 then + root1 = -b / (2*a) + root2 = -b / (2*a) + else + sqrtdelta = math.sqrt(delta) + + root1 = (-b + sqrtdelta) / (2*a) + root2 = (-b - sqrtdelta) / (2*a) + end + else + root1, root2 = solve_cx_quadratic(a, b, c) + end + + return root1, root2 -- Two real roots +end + +function solve_cx_quadratic(a, b, c) + local d = b*b - 4*a*c + local dcx = point.sqrt(d) + local root1 = (- b + dcx) / (2*a) + local root2 = (- b - dcx) / (2*a) + return root1, root2 +end + +-- function solve_cubic(a, b, c, d) +-- local p = (3*a*c - b*b)/(3*a*a) +-- local q = (2*b*b*b - 9*a*b*c + 27*a*a*d)/(27*a*a*a) +-- local delta = q*q+4*p*p*p/27 +-- local offset = - b / (3*a) +-- if delta > tkz_epsilon then +-- local r = (- q + math.sqrt(delta))/2 +-- local s = (- q - math.sqrt(delta))/2 +-- if r > 0 then +-- u = r^(1/3) +-- else +-- u = -(-r)^(1/3) +-- end +-- if s > 0 then +-- v = s^(1/3) +-- else +-- v = -(-s)^(1/3) +-- end +-- return u + v + offset +-- end +-- if delta < 0 then +-- local u = 2 * math.sqrt( - p / 3) +-- local v = math.acos(((3*q)/(2*p)) * math.sqrt( -3 / p)) / 3 +-- local x1 = u * math.cos(v) + offset +-- local x2 = u * math.cos(v + 2 * math.pi/3) + offset +-- local x3 = u * math.cos(v - 2 * math.pi/3) + offset +-- return {x1,x2,x3} +-- end +-- if delta == 0 then +-- return {3*q/p+offset,-3*q/(2*p)+offset,-3*q/(2*p)+offset} +-- end +-- end + +function display_real (r) + local format_string,format_string + if r == nil then return "" + else + if near_integer ( r ) + then + r = math.round ( r ) + format_string = string.format("%%.%df", 0) + else + format_string = string.format("%%.%df", tkz_dc) + end + local st = string.format(format_string , r) + return st + end +end + + +function display_imag (r) + local sgn + sgn = get_sign (r) + r = math.abs(r) + if math.abs(r-1) < tkz_epsilon then + r = nil + elseif near_integer ( r ) then + r = math.abs(math.round(r)) + end + st = display_real (r) + return sgn,st +end + +function display (z) + if (type(z) == "number") then return display_real (z) else + local real, imag + real = z.re + imag = z.im + if is_zero ( imag ) then + return display_real (real) + else + str = display_real (real) + sgni,sti = display_imag (imag) + if str == "0" then + str="" + sgni = "" end + local st = str ..sgni..sti.."i" + return st + end +end end |