summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/tkz-elements/tkz_elements_vector.lua
blob: 5fdebade8b8b16ee963cdb0fd80bd5e7a9483319 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
-- tkz_elements_vectors.lua
-- date 2025/02/14
-- version 3.30
-- 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.

-- ----------------------------------------------------------------------------
vector = {}
-- Constructor for creating a new vector
function vector:new(za, zb)
    local type          = 'vector'
    local slope         = angle_normalize_(point.arg(zb-za))
    local norm          = point.mod(zb-za)
    local mtx           = matrix:new { { za }, { zb } }
    local vect =  {tail    = za, 
                head    = zb,
                norm    = norm,
                mtx     = mtx,
                slope   = slope,
                type    = type }
    setmetatable(vect, self)
    self.__index = self
    return vect
end

function vector.__add(v1,v2)
  return v1 : add (v2)
end

function vector.__sub(v1,v2)
  return v1:add(v2:scale(-1))
end

function vector.__unm(v)
 return v:scale(-1)
end

function vector.__mul(r,v)
  return v : scale(r)
end
-- Normalize the vector (unit vector)
function vector: normalize  ()
   local z  = self.head-self.tail
   local d  = point.abs(z)
   local nz = point(z.re / d, z.im / d)
   return vector:new(self.tail, nz + self.tail)
end

  function vector: add (ve)
    return vector :new (self.tail,self.head+ve.head-ve.tail)
  end
-- Create an orthogonal vector 
function vector:orthogonal (d)
if d == nil then
   return vector : new (self.tail, rotation_(self.tail,math.pi/2,self.head))
else
  local z = self.tail+ point (d*math.cos(self.slope),d*math.sin(self.slope))
 return vector : new (self.tail, rotation_(self.tail,math.pi/2,z))
end
end

-- Scale the vector by a scalar
function vector:scale(d)
    local z = self.tail + point(d * self.norm * math.cos(self.slope), d * self.norm * math.sin(self.slope))
    return vector:new(self.tail, z)
end
 
function vector:at (zc)
     return vector:new(zc, zc + self.head - self.tail)
end

return vector