summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_matrices.lua
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_matrices.lua')
-rw-r--r--macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_matrices.lua219
1 files changed, 219 insertions, 0 deletions
diff --git a/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_matrices.lua b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_matrices.lua
new file mode 100644
index 0000000000..ed5fa5b1f3
--- /dev/null
+++ b/macros/latex/contrib/tkz/tkz-elements/latex/tkz_elements_matrices.lua
@@ -0,0 +1,219 @@
+-- tkz_elements_matrices.lua
+-- 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
+-- of this license or (at your option) any later version.
+-- The latest version of this license is in
+-- http://www.latex-project.org/lppl.txt
+-- and version 1.3 or later is part of all distributions of LaTeX
+-- version 2005/12/01 or later.
+-- This work has the LPPL maintenance status “maintained”.
+-- The Current Maintainer of this work is Alain Matthes.
+
+-- ----------------------------------------------------------------------------
+matrix={}
+function matrix: new (value)
+ local type = 'matrix'
+ local rows = #value
+ local cols = #value[1]
+ local set = value
+ local det = determinant(value)
+ local o = {set = set,
+ rows = rows,
+ cols = cols,
+ det = det,
+ type = type }
+ setmetatable(o, self)
+ self.__index = self
+ return o
+end
+
+function matrix.__mul(m1,m2)
+ if getmetatable(m1) ~= matrix then return k_mul_matrix(m1, m2) end
+ if getmetatable(m2) ~= matrix then return k_mul_matrix(m2, m1) end
+ return mul_matrix(m1,m2)
+end
+
+function matrix.__add(m1,m2)
+ return add_matrix(m1,m2)
+end
+
+function matrix.__sub(m1,m2)
+ return add_matrix(m1,k_mul_matrix(-1, m2))
+end
+
+function matrix.__pow( m, num )
+ if num =='T' then
+ return transposeMatrix(m)
+ else
+ if num == 0 then
+ return matrix:new( #m,"I" )
+ end
+ if num < 0 then
+ local i; m,i = inv_matrix ( m )
+ if not m then return m, i end
+ num = -num
+ end
+ local mt = m
+ for i = 2,num do
+ mt = mul_matrix(mt,m)
+ end
+ return mt
+end
+end
+
+function matrix.__tostring( A )
+ local mt = (A.type=='matrix' and A.set or A)
+ local k = {}
+ for i = 1,#mt do
+ local n = {}
+ for j = 1,#mt[1] do
+ n[j] = display(mt[i][j])
+ end
+ k[i] = table.concat(n, " ")
+ end
+ return table.concat(k)
+end
+
+function matrix.__eq( A , B )
+ local mt1 = (A.type=='matrix' and A.set or A)
+ local mt2 = (B.type=='matrix' and B.set or B)
+ if A.type ~= B.type then
+ return false
+ end
+
+ if #mt1 ~= #mt2 or #mt1[1] ~= #mt2[1] then
+ return false
+ end
+
+ for i = 1,#mt1 do
+ for j = 1,#mt1[1] do
+ if mt1[i][j] ~= mt2[i][j] then
+ return false
+ end
+ end
+ end
+ return true
+end
+
+function matrix : square(n,...)
+ local m = {}
+ local t = table.pack(...)
+ if n*n == #t then
+ for i = 1, n do
+ m[i] = {}
+ for j = 1, n do
+ m[i][j] = t[n*(i-1)+j]
+ end
+ end
+ return matrix : new (m)
+ else
+ return nil
+ end
+end
+
+function matrix: vector (...)
+ local m = {}
+ local t = table.pack(...)
+ for i = 1, #t do
+ m[i] = {}
+ m[i][1] = t[i]
+ end
+ return matrix : new (m)
+end
+
+function matrix : homogenization ()
+ return homogenization_ (self)
+end
+
+function matrix : htm_apply (...)
+ local obj,nb,t
+ local tp = table.pack(...)
+ obj = tp[1]
+ nb = tp.n
+ if nb == 1 then
+ if obj.type == "point" then
+ return htm_apply_ ( self,obj )
+ elseif obj.type == "line" then
+ return htm_apply_L_ (self,obj)
+ elseif obj.type == "triangle" then
+ return htm_apply_T_ (self,obj)
+ elseif obj.type == "circle" then
+ return htm_apply_C (self,obj)
+ elseif obj.type == "square"
+ or obj.type == "rectangle"
+ or obj.type == "quadrilateral"
+ or obj.type == "parallelogram" then
+ return htm_apply_Q (self,obj)
+ end
+ else
+ t = {}
+ for i=1,tp.n do
+ table.insert(t , htm_apply_ ( self , tp[i]))
+ end
+ return table.unpack ( t )
+ end
+end
+
+function matrix: k_mul (n)
+ return k_mul_matrix(n, self)
+end
+
+function matrix : get (i,j)
+ return get_element_( self,i,j )
+end
+
+function matrix: inverse ()
+ return inv_matrix (self)
+end
+
+function matrix: adjugate ()
+ return adjugate_ (self)
+end
+
+function matrix: transpose ()
+ return transposeMatrix (self)
+end
+
+function matrix: is_diagonal ()
+ return isDiagonal_ (self)
+end
+
+function matrix: is_orthogonal ()
+ return isOrthogonal_ (self)
+end
+
+function matrix: diagonalize () -- return two matrices D and P
+ return diagonalize_ (self)
+end
+
+function matrix: print (style,fmt)
+ local style = (style or 'bmatrix')
+ local fmt = (fmt or 0)
+ return print_matrix (self,style,fmt)
+end
+
+function matrix: identity (n)
+ return id_matrix (n)
+end
+
+-------------------------
+-- homogeneous transformation matrix
+function matrix : htm (phi,a,b,sx,sy)
+ local tx = (a or 0)
+ local ty = (b or 0)
+ local sx = (sx or 1)
+ local sy = (sy or 1)
+ local phi = (phi or 0)
+ return matrix : square (3,sx*math.cos(phi),-math.sin(phi),tx,math.sin(phi),sy*math.cos(phi),ty,0,0,1)
+end
+-------------------------
+
+function matrix: is_orthogonal ()
+ return isOrthogonal_ (self)
+end
+
+return matrix
+