epimath100 1.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/lib/epimath100/error.class.rb +100 -0
- data/lib/epimath100/line.class.rb +105 -0
- data/lib/epimath100/matrix.class.rb +307 -0
- data/lib/epimath100/point.class.rb +50 -0
- data/lib/epimath100/polynomial.class.rb +88 -0
- data/lib/epimath100/vector.class.rb +374 -0
- data/lib/epimath100.rb +11 -0
- metadata +57 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: dfc33b95a013088913670b6a6dad2b4bdec2d199
|
4
|
+
data.tar.gz: edb093c443f19cb614ae2c754cffa59d047af727
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 5613ff9bee2e2234790239a4b4db1c017124ac54933c6601c67720056e8b563d6e7caf60fbda5dfb3df0351988c4993186d643538a98f29ceb9e663e8e9a62d7
|
7
|
+
data.tar.gz: f997b826a3534bdfe8d303c0cc9fd281168e4ac0431b06d9ffbf4f2321de265b46f63192ed6acf886c9e6bf23ae45ecba77e1010029a611a56d4dc599e67e94d
|
@@ -0,0 +1,100 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
=begin
|
4
|
+
Error is a class to display and manage your simple errors
|
5
|
+
=end
|
6
|
+
|
7
|
+
|
8
|
+
class Error
|
9
|
+
ERR_HIGH = "Fatal Error"
|
10
|
+
ERR_MEDIUM = "Error"
|
11
|
+
ERR_LOW = "Warning"
|
12
|
+
ERR_COLOR_RED = "0;31"
|
13
|
+
ERR_COLOR_GREEN = "0;32"
|
14
|
+
ERR_COLOR_YELLOW = "1;33"
|
15
|
+
ERR_COLOR_BLUE = "0;34"
|
16
|
+
ERR_COLOR_ORANGE = "0;33"
|
17
|
+
@@errors = 0
|
18
|
+
|
19
|
+
# The function will check if the specified value can be converted to a Numerical value.
|
20
|
+
# == Parameters:
|
21
|
+
# type::
|
22
|
+
# ...
|
23
|
+
# == Returns:
|
24
|
+
# True/False
|
25
|
+
def self.isnum? string
|
26
|
+
if string.is_a?String and string != nil
|
27
|
+
if string.to_i.to_s == string or string.to_f.to_s == string
|
28
|
+
return true
|
29
|
+
elsif string.to_i.to_s == string[1..-1] or string.to_f.to_s == string[1..-1]
|
30
|
+
true
|
31
|
+
else
|
32
|
+
return false
|
33
|
+
end
|
34
|
+
elsif string.is_a?Numeric
|
35
|
+
true
|
36
|
+
else
|
37
|
+
Error.call "'#{string}' is not a String"
|
38
|
+
return false
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
# "call" is a function you can acces with:
|
43
|
+
# Error.call "message", ERR_LEVEL
|
44
|
+
# == The error's levels are :
|
45
|
+
# * ERR_HIGH
|
46
|
+
# * ERR_MEDIUM
|
47
|
+
# * ERR_LOW
|
48
|
+
# The error's level influence the color (visibility) and defined if the programm must exit.
|
49
|
+
# An ERR_HIGH is only to call exit and stop the programm. So be carrefull.
|
50
|
+
# ERR_MEDIUM and ERR_LOW will just display the message and no more.
|
51
|
+
# ERR_HIGH is the default value, you can change it if yo want
|
52
|
+
# def self.call m, level=ERR_MEDIUM
|
53
|
+
#
|
54
|
+
# == Parameters:
|
55
|
+
# m::
|
56
|
+
# A String that will be display. You don't need to specify the prefix ("Error :") or the final "."
|
57
|
+
# level::
|
58
|
+
# A optional parameter, wich influence the degree of the error. Default is ERR_HIGH, will kill your programm
|
59
|
+
# So, be carrefull. You can change this value. It may be ERR_HIGH (Default), ERR_MEDIUM, ERR_LOW
|
60
|
+
#
|
61
|
+
# == Returns:
|
62
|
+
# nil
|
63
|
+
def self.call m, level=Error::ERR_HIGH
|
64
|
+
|
65
|
+
if level != Error::ERR_HIGH and level != Error::ERR_MEDIUM and level != Error::ERR_LOW
|
66
|
+
self.call "Error::call : error level invalid", Error::ERR_MEDIUM
|
67
|
+
end
|
68
|
+
|
69
|
+
#message color
|
70
|
+
if level == Error::ERR_HIGH
|
71
|
+
color = Error::ERR_COLOR_RED
|
72
|
+
elsif level == Error::ERR_MEDIUM
|
73
|
+
color = Error::ERR_COLOR_ORANGE
|
74
|
+
elsif level == Error::ERR_LOW
|
75
|
+
color = Error::ERR_COLOR_YELLOW
|
76
|
+
end
|
77
|
+
|
78
|
+
#message display
|
79
|
+
if level == Error::ERR_HIGH
|
80
|
+
puts "\033[#{color}m#{level} : #{m}.\033[00m"
|
81
|
+
exit
|
82
|
+
elsif level == Error::ERR_MEDIUM
|
83
|
+
puts "\033[#{color}m#{level} : #{m}.\033[00m"
|
84
|
+
elsif level == Error::ERR_LOW
|
85
|
+
puts "\033[#{color}m#{level} : #{m}.\033[00m"
|
86
|
+
end
|
87
|
+
|
88
|
+
@@errors += 1
|
89
|
+
return self
|
90
|
+
end
|
91
|
+
|
92
|
+
# == Parameters:
|
93
|
+
# nothing::
|
94
|
+
#
|
95
|
+
# == Returns:
|
96
|
+
# Integer which contains the numbr of errors called
|
97
|
+
def self.errors
|
98
|
+
@@errors
|
99
|
+
end
|
100
|
+
end
|
@@ -0,0 +1,105 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
require_relative 'error.class.rb'
|
4
|
+
require_relative 'point.class.rb'
|
5
|
+
require_relative 'vector.class.rb'
|
6
|
+
|
7
|
+
class Line
|
8
|
+
attr_reader :point, :v_dir, :equ_para
|
9
|
+
|
10
|
+
# == Parameters:
|
11
|
+
# point::
|
12
|
+
# Any point on the line. It must be a Point (../point/point.class.rb)
|
13
|
+
# vector::
|
14
|
+
# Any vector director of the line. It must be a Vector (../vector/vector.class.rb)
|
15
|
+
def initialize point, vector
|
16
|
+
Error.call "Line::new : '#{point}' is not a Point" if !point.is_a?Point
|
17
|
+
Error.call "Line::new : '#{vector}' is not a Vector" if !vector.is_a?Vector
|
18
|
+
Error.call "Line::new : '#{vector}' can't be Null" if vector.nil?
|
19
|
+
|
20
|
+
@point = point
|
21
|
+
@v_dir = vector
|
22
|
+
@equ_para = Line::parametric @point, @v_dir
|
23
|
+
end
|
24
|
+
|
25
|
+
# TODO : fix if if if if if
|
26
|
+
# Check if the point specified is ON the line
|
27
|
+
# == Parameter:
|
28
|
+
# p::
|
29
|
+
# p is a Point
|
30
|
+
# == Returns:
|
31
|
+
# true/false
|
32
|
+
def point_owned? p
|
33
|
+
Error.call "Line::point_owned? : #{p} is not a valid Point" if !p.is_a?Point
|
34
|
+
|
35
|
+
l = parametric()
|
36
|
+
|
37
|
+
ux = (p.x - l[:x][:p]) / l[:x][:v]
|
38
|
+
uy = (p.y - l[:y][:p]) / l[:y][:v]
|
39
|
+
uz = (p.z - l[:z][:p]) / l[:z][:v]
|
40
|
+
|
41
|
+
if l[:x][:v] == 0 and p.x == l[:x][:p]
|
42
|
+
ux = uy
|
43
|
+
end
|
44
|
+
|
45
|
+
if l[:y][:v] == 0 and p.y == l[:y][:p]
|
46
|
+
uy = uz
|
47
|
+
end
|
48
|
+
|
49
|
+
if l[:z][:v] == 0 and p.z == l[:z][:p]
|
50
|
+
uz = ux
|
51
|
+
end
|
52
|
+
|
53
|
+
if ux == uy and ux == uz
|
54
|
+
true
|
55
|
+
else
|
56
|
+
false
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
# == Returns::
|
61
|
+
# same than self.parametric but with the current object
|
62
|
+
def parametric
|
63
|
+
return Line::parametric @point, @v_dir
|
64
|
+
end
|
65
|
+
|
66
|
+
# == Parameters:
|
67
|
+
# point::
|
68
|
+
# point is a Point on the line
|
69
|
+
# v_dir::
|
70
|
+
# a vector director of the line
|
71
|
+
# == Returns:
|
72
|
+
# Hash
|
73
|
+
def self.parametric point, v_dir
|
74
|
+
Error.call "Line::parametric : Invalid vector" if !v_dir.is_a?Vector
|
75
|
+
Error.call "Line::parametric : Invalid point" if !point.is_a?Point
|
76
|
+
|
77
|
+
þ = 1
|
78
|
+
{ :x => { :p => point.x, :v => þ * v_dir.x},
|
79
|
+
:y => { :p => point.y, :v => þ * v_dir.y},
|
80
|
+
:z => { :p => point.z, :v => þ * v_dir.z}}
|
81
|
+
end
|
82
|
+
|
83
|
+
def to_s(options={})
|
84
|
+
if options == {}
|
85
|
+
"droite passant par le point (#{@point.x};#{@point.y};#{@point.z}), de vecteur directeur #{@v_dir.to_s}"
|
86
|
+
else
|
87
|
+
Error.call "Line::to_s : options is not valid"
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
# This function returns the point on the line where x = v * vx + px, ...
|
92
|
+
# == Parameters:
|
93
|
+
# v::
|
94
|
+
# The value defined the point wich will be return.
|
95
|
+
# == Returns:
|
96
|
+
# The choosed Point one the line from v (lambda)
|
97
|
+
def function v
|
98
|
+
Error.call "Line::function : unable to execute function : the vector v_dir is null" if self.nil?
|
99
|
+
Error.call "Line::functionx : invalid lambda ( #{v} ) value" if !v.is_a?Numeric
|
100
|
+
|
101
|
+
lp = parametric()
|
102
|
+
Point.new(lp[:x][:p] + v * lp[:x][:v], lp[:y][:p] + v * lp[:y][:v], lp[:z][:p] + v * lp[:z][:v])
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
@@ -0,0 +1,307 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
require_relative 'error.class'
|
4
|
+
require_relative 'vector.class'
|
5
|
+
|
6
|
+
# TODO : improve the documentation
|
7
|
+
class Matrix
|
8
|
+
attr_reader :columns, :lines, :v
|
9
|
+
|
10
|
+
# Convert each element of an Array in an Integer => must be implented in Array Class
|
11
|
+
def self.to_inttab arg, num=Float
|
12
|
+
Error.call "Matrix::to_inttab : '#{arg}' is not a valid Array", Error::ERR_HIGH if !arg.is_a?Array
|
13
|
+
|
14
|
+
arg.size.times do |i|
|
15
|
+
# if it's an Array in an Array, the
|
16
|
+
if arg[i].is_a?Array
|
17
|
+
arg[i] = self.to_inttab argv[i]
|
18
|
+
|
19
|
+
else
|
20
|
+
if num == Integer
|
21
|
+
arg[i] = arg[i].to_i
|
22
|
+
else
|
23
|
+
arg[i] = arg[i].to_f
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
# == Parameters:
|
31
|
+
# tab::
|
32
|
+
# tab is a double Array like [ [1,2], [3,4], [1,4] ]. This array should be a valid Matrix tab or an other Matrix
|
33
|
+
#
|
34
|
+
# == Returns:
|
35
|
+
# nothing
|
36
|
+
def initialize tab=[[]]
|
37
|
+
@v = tab #Must call to_inttab
|
38
|
+
@columns = 0
|
39
|
+
@lines = 0
|
40
|
+
|
41
|
+
if tab.is_a?Array and tab.size > 0 and tab[0].is_a?Array
|
42
|
+
@columns = tab[0].size
|
43
|
+
|
44
|
+
# check if the line have the good size
|
45
|
+
tab.size.times do |i|
|
46
|
+
@lines += 1
|
47
|
+
if (tab[i].size != @columns)
|
48
|
+
Error.call "Matrix::new : '#{tab[i]}' is not a valid line"
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
elsif tab.is_a?Matrix
|
53
|
+
@v = tab.v
|
54
|
+
@columns = tab.columns
|
55
|
+
@lines = tab.lines
|
56
|
+
else
|
57
|
+
Error.call "Matrix::new : '#{tab}' is not a valid matrix"
|
58
|
+
end
|
59
|
+
return
|
60
|
+
end
|
61
|
+
|
62
|
+
def to_s
|
63
|
+
out = ""
|
64
|
+
|
65
|
+
@v.each do |line|
|
66
|
+
out << "["
|
67
|
+
|
68
|
+
# display all elements of this line
|
69
|
+
line.each do |element|
|
70
|
+
out << element.to_f.round(3).to_s << " "
|
71
|
+
end
|
72
|
+
|
73
|
+
out << "\b]\n" # TODO : FIX THAT broggi_t
|
74
|
+
end
|
75
|
+
out
|
76
|
+
end
|
77
|
+
|
78
|
+
def to_ary
|
79
|
+
@v
|
80
|
+
end
|
81
|
+
|
82
|
+
def to_vector
|
83
|
+
return Vector.new self.get_val(0, 0), self.get_val(1, 0)
|
84
|
+
end
|
85
|
+
|
86
|
+
def new_line tab=[]
|
87
|
+
Error.call "Matrix::new_line : Size of the new line (#{tab} => #{tab.size}) is not valid" if !tab.is_a?Array or tab.size != @column
|
88
|
+
|
89
|
+
@lines += 1
|
90
|
+
@v << tab
|
91
|
+
end
|
92
|
+
|
93
|
+
def new_column tab=[]
|
94
|
+
Error.call "Matrix::new_column : Size of the new column (#{tab} => #{tab.size}) is not valid" if !tab.is_a?Array or tab.size != @lines
|
95
|
+
|
96
|
+
@columns += 1
|
97
|
+
if tab.is_a? Array and tab.size == @lines
|
98
|
+
@lines.times do |i|
|
99
|
+
@v[i] << tab[i]
|
100
|
+
end
|
101
|
+
else
|
102
|
+
@lines.times do |i|
|
103
|
+
@v[i] << 0
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def del_line x=-1
|
109
|
+
if x.is_a?Integer and @v[x] != nil
|
110
|
+
@lines -= 1
|
111
|
+
@v.delete_at x
|
112
|
+
else
|
113
|
+
Error.call "Matrix::del_line : Line '#{x}' doesn't exist"
|
114
|
+
end
|
115
|
+
end
|
116
|
+
|
117
|
+
# == Parameters:
|
118
|
+
# x,y::
|
119
|
+
# Integers. They are the coordonates of the value which will extract from the matrix
|
120
|
+
# == Returns:
|
121
|
+
# a value fo the matrix
|
122
|
+
def get_val x, y
|
123
|
+
if !x.is_a?Integer
|
124
|
+
Error.call "Matrix::get_val : '#{x}' is not a correct line"
|
125
|
+
return nil
|
126
|
+
elsif !y.is_a?Integer
|
127
|
+
Error.call "Matrix::get_val : '#{y}' is not a correct column"
|
128
|
+
return nil
|
129
|
+
elsif x < 0 or y < 0 or x >= @lines or y >= @columns
|
130
|
+
Error.call "Matrix::get_val : The specified positions are invalids (#{x},#{y})"
|
131
|
+
return nil
|
132
|
+
else
|
133
|
+
return @v[x][y]
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
# == Parameters:
|
138
|
+
# x,y::
|
139
|
+
# Integers. They are the coordonates of the value which will write in the matrix
|
140
|
+
# == Returns:
|
141
|
+
# a value fo the matrix
|
142
|
+
def set_val val, x, y
|
143
|
+
if !x.is_a?Integer
|
144
|
+
Error.call "Matrix::set_val : '#{x}' is not a correct line"
|
145
|
+
return nil
|
146
|
+
elsif !y.is_a?Integer
|
147
|
+
Error.call "Matrix::set_val : '#{y}' is not a correct column"
|
148
|
+
return nil
|
149
|
+
elsif !val.is_a?Numeric
|
150
|
+
Error.call "Matrix::set_val : '#{val}' is not a correct value"
|
151
|
+
return nil
|
152
|
+
elsif x < 0 or y < 0 or x >= @lines or y >= @columns
|
153
|
+
Error.call "Matrix::set_val : The specified positions are invalids (#{x} >= #{@lines},#{y} >= #{@columns})\n#{self.to_s}"
|
154
|
+
return nil
|
155
|
+
else
|
156
|
+
@v[x][y] = val
|
157
|
+
return @v[x][y]
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
161
|
+
# == Parameters:
|
162
|
+
# y::
|
163
|
+
# Integer. It's the n° line which is extracted
|
164
|
+
# == Returns:
|
165
|
+
# Array
|
166
|
+
def get_line x
|
167
|
+
Error.call "Matrix::get_line : Line #{x} doesn't exist" if !x.is_a?Integer or x < 0 or x >= @lines
|
168
|
+
|
169
|
+
return @v[x]
|
170
|
+
end
|
171
|
+
|
172
|
+
# == Parameters:
|
173
|
+
# y::
|
174
|
+
# Integer. It's the n° column which is extracted
|
175
|
+
# == Returns:
|
176
|
+
# Array
|
177
|
+
def get_column y
|
178
|
+
Error.call "Matrix::get_column : Column #{y} doesn't exist" if !y.is_a?Integer or y < 0 or y >= @columns
|
179
|
+
|
180
|
+
result = []
|
181
|
+
@lines.times do |i|
|
182
|
+
result << @v[i][y]
|
183
|
+
end
|
184
|
+
return result
|
185
|
+
end
|
186
|
+
|
187
|
+
# == Params:
|
188
|
+
# matrix::
|
189
|
+
# matrix is a Matrix to compare.
|
190
|
+
# == Returns:
|
191
|
+
# True or False.
|
192
|
+
# == Usage::
|
193
|
+
# The function check if the current matrix and matrix:: have the same dimensions (linse and columns)
|
194
|
+
def have_the_same_dimensions matrix
|
195
|
+
if (matrix.is_a?Matrix and matrix.columns == @columns and matrix.lines == @lines)
|
196
|
+
true
|
197
|
+
else
|
198
|
+
false
|
199
|
+
end
|
200
|
+
end
|
201
|
+
|
202
|
+
# == Parameters:
|
203
|
+
# t1,t2::
|
204
|
+
# Multiply each elements of t1 and t2 2b2 and sum all
|
205
|
+
# == Returns:
|
206
|
+
# Float
|
207
|
+
def self.mult_array(t1, t2)
|
208
|
+
Error.call "Can't multiply this. One of the arguments is not an array.", Error::ERR_HIGH if (!t1.is_a?Array or !t2.is_a?Array)
|
209
|
+
Error.call "Can't multiply this. Arrays do not have the same size.", Error::ERR_HIGH if t1.size != t2.size
|
210
|
+
|
211
|
+
result = 0.0
|
212
|
+
t1.size.times do |i|
|
213
|
+
result = (result + t1[i].to_f * t2[i].to_f).to_f
|
214
|
+
end
|
215
|
+
return result
|
216
|
+
end
|
217
|
+
|
218
|
+
# == Parameters:
|
219
|
+
# matrix::
|
220
|
+
# This argument is a Matrix or an Integer.
|
221
|
+
# If it's a Matrix, it will do matrix product.
|
222
|
+
# Else, if it's a integer, it will multiply each coeficient of the current Matrix.
|
223
|
+
#
|
224
|
+
# == Returns:
|
225
|
+
# Matrix
|
226
|
+
#
|
227
|
+
# == Matrix_Product:
|
228
|
+
# little explanation::
|
229
|
+
# If matrix is a Matrix, we will multiply 2by2 each coeficient of the column X of the current Matrix and the line X of matrix.
|
230
|
+
# Then, we do the sum of them and we put it in a new Matrix at the position X. The is just a sum up, view the details on wiki bitch.
|
231
|
+
def *(matrix)
|
232
|
+
#produit matriciel
|
233
|
+
#convert vector -> matrix
|
234
|
+
if matrix.is_a?Vector
|
235
|
+
Error.call "Matrix::* : Transformation implicite de Vector en Matrix", Error::ERR_LOW
|
236
|
+
matrix = matrix.to_matrix
|
237
|
+
end
|
238
|
+
|
239
|
+
if matrix.is_a?Matrix
|
240
|
+
Error.call "Matrix::* : Invalid multiplication at line #{matrix.lines} and column #{@columns}", Error::ERR_HIGH if @columns != matrix.lines
|
241
|
+
|
242
|
+
result = []
|
243
|
+
@lines.times do |i|
|
244
|
+
result << []
|
245
|
+
end
|
246
|
+
#colonne de resultat = colonne de matrix X
|
247
|
+
#ligne de resutlat = ligne de self Y
|
248
|
+
@lines.times do |y|
|
249
|
+
matrix.columns.times do |x|
|
250
|
+
result[y][x] = Matrix.mult_array(get_line(y), matrix.get_column(x))
|
251
|
+
end
|
252
|
+
end
|
253
|
+
|
254
|
+
return Matrix.new result
|
255
|
+
#produit d'un entier et d'une matrix
|
256
|
+
elsif matrix.is_a?Numeric
|
257
|
+
result = @v
|
258
|
+
@lines.times do |x|
|
259
|
+
@columns.times do |y|
|
260
|
+
result[x][y] = result[x][y].to_f * matrix
|
261
|
+
end
|
262
|
+
end
|
263
|
+
return Matrix.new result
|
264
|
+
#message d'erreur
|
265
|
+
else
|
266
|
+
Error.call "Matrix::* : Impossible de calculer cela (#{matrix} n'est pas une matrix)", Error::ERR_HIGH
|
267
|
+
end
|
268
|
+
end
|
269
|
+
|
270
|
+
# == Parameters:
|
271
|
+
# matrix::
|
272
|
+
# This argument is a Matrix or an Integer. If it's a Matrix, it must have the same dimensions than the current Matrix.
|
273
|
+
# Else, if it's a integer, it will be added to each coeficients of the current Matrix.
|
274
|
+
#
|
275
|
+
# == Returns:
|
276
|
+
# Matrix
|
277
|
+
def +(matrix)
|
278
|
+
result = @v
|
279
|
+
if have_the_same_dimensions matrix
|
280
|
+
@lines.times do |x|
|
281
|
+
@columns.times do |y|
|
282
|
+
result[x][y] += matrix.v[x][y]
|
283
|
+
end
|
284
|
+
end
|
285
|
+
elsif matrix.is_a?Numeric
|
286
|
+
@lines.times do |x|
|
287
|
+
@columns.times do |y|
|
288
|
+
result[x][y] += matrix
|
289
|
+
end
|
290
|
+
end
|
291
|
+
else
|
292
|
+
Error.call "Matrix::+ : Impossible de calculer cela", Error::ERR_HIGH
|
293
|
+
end
|
294
|
+
Matrix.new result
|
295
|
+
end
|
296
|
+
|
297
|
+
# == Returns::
|
298
|
+
# Numerical value which is the determinant of the matrix. It only work on 2x2
|
299
|
+
def get_deter
|
300
|
+
Error.call "Matrix::get_deter : This error comes from get_deter which works only with 2x2 matrix" if @columns != 2 or @lines != 2
|
301
|
+
|
302
|
+
det = get_val(0, 0).to_i * get_val(1, 1).to_i
|
303
|
+
det -= get_val(0, 1).to_i * get_val(1, 0).to_i
|
304
|
+
return det
|
305
|
+
end
|
306
|
+
|
307
|
+
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
require_relative 'error.class.rb'
|
4
|
+
|
5
|
+
class Point
|
6
|
+
def initialize x, y, z
|
7
|
+
if !x.is_a?Numeric or !y.is_a?Numeric or !z.is_a?Numeric
|
8
|
+
Error.call "Point::new : a passed argument is not a valid number"
|
9
|
+
end
|
10
|
+
@coord = {:x => x.to_f, :y => y.to_f, :z => z.to_f}
|
11
|
+
end
|
12
|
+
|
13
|
+
def +(p)
|
14
|
+
if p.is_a?Point
|
15
|
+
@coord.x += p.x
|
16
|
+
@coord.y += p.y
|
17
|
+
@coord.z += p.z
|
18
|
+
elsif p.is_a?Numeric
|
19
|
+
@coord.x += p
|
20
|
+
@coord.y += p
|
21
|
+
@coord.z += p
|
22
|
+
else
|
23
|
+
Error.call "Point::+ : passed argument is invalid"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def *(p)
|
28
|
+
Error.call "Point::+ : passed argument is invalid" if !p.is_a?Numeric
|
29
|
+
|
30
|
+
@coord.x *= p
|
31
|
+
@coord.y *= p
|
32
|
+
@coord.z *= p
|
33
|
+
end
|
34
|
+
|
35
|
+
def to_s
|
36
|
+
"(#{self.x}; #{self.y}; #{self.z})"
|
37
|
+
end
|
38
|
+
|
39
|
+
def x
|
40
|
+
@coord[:x]
|
41
|
+
end
|
42
|
+
|
43
|
+
def y
|
44
|
+
@coord[:y]
|
45
|
+
end
|
46
|
+
|
47
|
+
def z
|
48
|
+
@coord[:z]
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
require_relative 'error.class'
|
4
|
+
require_relative 'vector.class'
|
5
|
+
|
6
|
+
class Polynomial
|
7
|
+
EXPOSANT = {"0" => "⁰",
|
8
|
+
"1" => "¹",
|
9
|
+
"2" => "²",
|
10
|
+
"3" => "³",
|
11
|
+
"4" => "⁴",
|
12
|
+
"5" => "⁵",
|
13
|
+
"6" => "⁶",
|
14
|
+
"7" => "⁷",
|
15
|
+
"8" => "⁸",
|
16
|
+
"9" => "⁹"}
|
17
|
+
|
18
|
+
attr_accessor :coef
|
19
|
+
|
20
|
+
# Initialize the polynominal function
|
21
|
+
# Its coeficients are 1, 2, 3, 4 ... with '1'x⁰ + '2'x¹ + '3'x² ... = y
|
22
|
+
# Each coeficients has an associated value (exemple : 2 => 1 correspond to 1x²)
|
23
|
+
#
|
24
|
+
# == Notes:
|
25
|
+
# The function is compatible with the first version, where coeficients keys are :a, :b, ...
|
26
|
+
# == Parameters:
|
27
|
+
# hash::
|
28
|
+
# hash is a hash which have several keys 1, 2,... which correspond to the coeficients
|
29
|
+
# verb:: default is false
|
30
|
+
# verb is true or false, or a integer. It will display more information if turned on when to_s.
|
31
|
+
# if it's a integer, it must be in the list :
|
32
|
+
# - 0 : returns ""
|
33
|
+
# - 1 : "y = equation"
|
34
|
+
# - 2 : "f(x) = equation" (like true)
|
35
|
+
def initialize hash={}, verb=false
|
36
|
+
Error.call "Polynomial::new : You hash is invalid" if !hash.is_a?Hash
|
37
|
+
|
38
|
+
hash.select{|k,v| k.to_s.match(/[a-z]/)}.each do |k,v|
|
39
|
+
key = (k.to_s.ord - "a".ord)
|
40
|
+
hash[key] = v if hash[key] == nil
|
41
|
+
end
|
42
|
+
|
43
|
+
@coef = hash.select{|coef,value| coef.is_a?Numeric and coef >= 0 and value.is_a?Numeric}
|
44
|
+
@verbose = verb
|
45
|
+
end
|
46
|
+
|
47
|
+
#calculate the derivated function of the current polynomial
|
48
|
+
# == Returns:
|
49
|
+
# Polynomial (the derivated function)
|
50
|
+
def derive
|
51
|
+
dérivé = Polynomial.new
|
52
|
+
|
53
|
+
@coef.select{|coef,value| coef != 0}.each do |coef,value|
|
54
|
+
dérivé.coef[coef - 1] = value * coef
|
55
|
+
end
|
56
|
+
|
57
|
+
return dérivé
|
58
|
+
end
|
59
|
+
|
60
|
+
def to_s
|
61
|
+
return "" if @verbose == 0
|
62
|
+
|
63
|
+
str = ""
|
64
|
+
str = "#{@coef[0].to_i}" + str #if @coef[:a]
|
65
|
+
|
66
|
+
@coef.select{|coef,value| coef != 0}.each do |coef,value|
|
67
|
+
#sign = "+"
|
68
|
+
#sign = "-" if value < 0
|
69
|
+
str = "#{value}x^#{coef} + " + str if value != 0
|
70
|
+
end
|
71
|
+
str = "f(x) = " + str if @verbose == true or @verbose == 2
|
72
|
+
str = "y = " + str if @verbose == 1
|
73
|
+
|
74
|
+
return str
|
75
|
+
end
|
76
|
+
|
77
|
+
# Calculate the value of f(x) from x
|
78
|
+
def calc x
|
79
|
+
Error.call "Polynomial::calc: x is not a Numeric value" if !x.is_a?Numeric
|
80
|
+
|
81
|
+
y = 0
|
82
|
+
@coef.each do |coef,value|
|
83
|
+
y += value * x**coef
|
84
|
+
end
|
85
|
+
|
86
|
+
return y
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,374 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
require_relative 'error.class'
|
4
|
+
require_relative 'matrix.class'
|
5
|
+
|
6
|
+
class Vector
|
7
|
+
attr_accessor :x, :y, :z, :verbose
|
8
|
+
attr_reader :matrix_op
|
9
|
+
|
10
|
+
# == Parameters:
|
11
|
+
# par1::
|
12
|
+
# The first parameter may be a point coordonate x, or a other Vector.
|
13
|
+
# If it's a Vector, it will be copied. Else if it is anything else, it will be converted as Float and stored as a abcissa.
|
14
|
+
# par2,par3::
|
15
|
+
# Theses optionals parameters are used if the first parameter is not a Vector. If it occure, par2 is mandatory (but not par3).
|
16
|
+
# They will be stored in @y and @z.
|
17
|
+
# verbose::
|
18
|
+
# verbose turn on/off the messages with translate, rotate, ...
|
19
|
+
#
|
20
|
+
# == Returns:
|
21
|
+
# himself
|
22
|
+
#
|
23
|
+
# == Errors::
|
24
|
+
# If a parameter is invalid, it may be crash the programm with an ERR_HIGH
|
25
|
+
def initialize par1, par2=nil, par3=nil, verbose=true
|
26
|
+
if par1.is_a?Vector #and par2 == nil and par3 == nil
|
27
|
+
@x = par1.x
|
28
|
+
@y = par1.y
|
29
|
+
@z = par1.z
|
30
|
+
|
31
|
+
elsif par1 != nil and par2 != nil
|
32
|
+
if par3 == nil
|
33
|
+
par3 = 1.0
|
34
|
+
end
|
35
|
+
|
36
|
+
if !Error.isnum?par1 or !Error.isnum?par2 or !Error.isnum?par3
|
37
|
+
Error.call "Vector::new : a passed argument is not a valid number"
|
38
|
+
end
|
39
|
+
|
40
|
+
@x = par1.to_f
|
41
|
+
@y = par2.to_f
|
42
|
+
@z = par3.to_f
|
43
|
+
else
|
44
|
+
Error.call "Vector::new : The vector couldn't be initialisze with theses parameters : :par1 => '#{par1}', :par2 => '#{par2}'"
|
45
|
+
end
|
46
|
+
|
47
|
+
@verbose = verbose
|
48
|
+
@matrix_op = init_matrix_op
|
49
|
+
return self
|
50
|
+
end
|
51
|
+
|
52
|
+
# Return to the norm of the currenet vector
|
53
|
+
def norm
|
54
|
+
Math.sqrt(@x**2 + @y**2 + @z**2)
|
55
|
+
end
|
56
|
+
|
57
|
+
# == Returns:
|
58
|
+
# Matrix.new [[1, 0, 0],[0, 1, 0], [0, 0, 1]]
|
59
|
+
def init_matrix_op
|
60
|
+
@matrix_op = Matrix.new [[1, 0, 0],[0, 1, 0], [0, 0, 1]]
|
61
|
+
end
|
62
|
+
|
63
|
+
# == Parameters:
|
64
|
+
# par1::
|
65
|
+
# It may be a point coordonate x, or a other Vector.
|
66
|
+
# If it's a Vector, it will be used as a couple of coordonates. Else if it is anything else, it will be converted as Float added to @x
|
67
|
+
#
|
68
|
+
# == Returns:
|
69
|
+
# nothing
|
70
|
+
#
|
71
|
+
# == Errors::
|
72
|
+
# If a parameter is invalid, it may be crash the programm with an ERR_HIGH
|
73
|
+
# If the vectors do not have the same dimensions, it will display a warning
|
74
|
+
def +(par1)
|
75
|
+
out = Vector.new(self)
|
76
|
+
|
77
|
+
if par1 != nil and par1.is_a?Vector #and par2 == nil and par3 == nil
|
78
|
+
out.x += par1.x
|
79
|
+
out.y += par1.y
|
80
|
+
|
81
|
+
elsif par1 != nil
|
82
|
+
par1 = par1.to_f
|
83
|
+
out.x += par1
|
84
|
+
out.y += par1
|
85
|
+
|
86
|
+
if out.z != nil and par1 == nil
|
87
|
+
Error.call "The vector #{Vector.new(par1, par1, par1).to_s} do not have the same dimensions than #{out.to_s}", Error::ERR_HIGH
|
88
|
+
elsif out.z != nil
|
89
|
+
out.z += par1
|
90
|
+
end
|
91
|
+
else
|
92
|
+
Error.call "The vector couldn't be added with this parameters : #{par1}", Error::ERR_HIGH
|
93
|
+
end
|
94
|
+
return out
|
95
|
+
end
|
96
|
+
|
97
|
+
# == Usage:
|
98
|
+
# It is simply like + buf multiply by -1 par1
|
99
|
+
def -(par1)
|
100
|
+
if par1 == nil
|
101
|
+
Error.call "Can't sub nil from vector"
|
102
|
+
end
|
103
|
+
return (self.+(par1 * -1))
|
104
|
+
end
|
105
|
+
|
106
|
+
# == Parameters:
|
107
|
+
# par1:
|
108
|
+
# This parameter may be a Vector or a number. If it's a Number, it will multiply all coponents of the Vector.
|
109
|
+
# If it's an other vector, we will multiplie their components 2by2
|
110
|
+
# == Returns:
|
111
|
+
# Vector
|
112
|
+
def *(par1)
|
113
|
+
out = Vector.new(self)
|
114
|
+
if par1.is_a?Numeric
|
115
|
+
out.x *= par1
|
116
|
+
out.y *= par1
|
117
|
+
if out.z != nil
|
118
|
+
out.z *= par1
|
119
|
+
end
|
120
|
+
elsif par1.is_a?Matrix
|
121
|
+
return (self.to_matrix * par1).to_vector
|
122
|
+
elsif par1.is_a?Vector
|
123
|
+
ary1 = [self.x, self.y]
|
124
|
+
if out.z != nil
|
125
|
+
ary1 << out.z
|
126
|
+
end
|
127
|
+
|
128
|
+
ary2 = [par1.x, par1.y]
|
129
|
+
if out.z != nil
|
130
|
+
ary2 << par1.z
|
131
|
+
end
|
132
|
+
|
133
|
+
aryr = Matrix.mult_array(ary1, ary2)
|
134
|
+
out.x = aryr[0]
|
135
|
+
out.y = aryr[1]
|
136
|
+
if aryr[2] != nil
|
137
|
+
out.z = aryr[2]
|
138
|
+
end
|
139
|
+
else
|
140
|
+
Error.call "Unable to add '#{par1} to this vector", Error::ERR_HIGH
|
141
|
+
end
|
142
|
+
return out
|
143
|
+
end
|
144
|
+
|
145
|
+
# == Parameters:
|
146
|
+
# par1, par2::
|
147
|
+
# They are the components of the vector to translate.
|
148
|
+
# par3::
|
149
|
+
# Optional component (z)
|
150
|
+
# see +::
|
151
|
+
def translate par1, par2, par3=0.0
|
152
|
+
if !Error.isnum? par1 or !Error.isnum? par2 or !Error.isnum? par3
|
153
|
+
Error.call "A parameter to the translation is not a valid number", Error::ERR_HIGH
|
154
|
+
end
|
155
|
+
|
156
|
+
s = Matrix.new [[1.0, 0.0, par1.to_f], [0.0, 1.0, par2.to_f], [0.0, 0.0, 1.0]]
|
157
|
+
@matrix_op = s
|
158
|
+
cpy = self
|
159
|
+
cpy.z = 1.0
|
160
|
+
|
161
|
+
puts "translation de vecteur #{Vector.new(par1,par2,par3).to_s}" if @verbose
|
162
|
+
|
163
|
+
return (s * cpy.to_matrix).to_vector
|
164
|
+
end
|
165
|
+
|
166
|
+
# == Parameters:
|
167
|
+
# c1,c2,c3::
|
168
|
+
# c1 and c2 are the coeficiens of the homothetie. c3 is optional
|
169
|
+
def homothétie c1, c2, c3=1.0
|
170
|
+
if c1 == nil or c2 == nil
|
171
|
+
Error.call "Coefficients are invalids"
|
172
|
+
end
|
173
|
+
|
174
|
+
s = Matrix.new [[c1.to_f, 0, 0], [0, c2.to_f, 0], [0, 0, c3.to_f]]
|
175
|
+
@matrix_op = s
|
176
|
+
cpy = self
|
177
|
+
cpy.z = 1.0
|
178
|
+
|
179
|
+
puts "homothétie de rapports #{c1.to_f}, #{c2.to_f}" if @verbose
|
180
|
+
|
181
|
+
return (s * cpy.to_matrix).to_vector
|
182
|
+
end
|
183
|
+
|
184
|
+
# == Parameters:
|
185
|
+
# a::
|
186
|
+
# The angle in degree
|
187
|
+
#
|
188
|
+
# == Return value:
|
189
|
+
# It returns the vector after the translation.
|
190
|
+
def rotate a
|
191
|
+
if a == nil
|
192
|
+
Error.call "Angle is invalid"
|
193
|
+
end
|
194
|
+
|
195
|
+
rad = Math::PI * a.to_f / 180.0
|
196
|
+
cpy = self # copy to have the same value in z
|
197
|
+
cpy.z = 0.0
|
198
|
+
s = Matrix.new [[ Math.cos(rad), -Math.sin(rad), 0], [Math.sin(rad), Math.cos(rad), 0], [0, 0, 1]]
|
199
|
+
@matrix_op = s
|
200
|
+
|
201
|
+
puts "rotation d'angle #{a.to_f}" if @verbose
|
202
|
+
|
203
|
+
return (s * cpy.to_matrix).to_vector
|
204
|
+
end
|
205
|
+
|
206
|
+
# == Parameters :
|
207
|
+
# angle::
|
208
|
+
# It is the incline of the line.
|
209
|
+
#
|
210
|
+
# == Return value:
|
211
|
+
# It returns the vector after the translation.
|
212
|
+
def symetric angle
|
213
|
+
Error.call "Variable angle is not a number (#{angle})", Error::ERR_HIGH if !Error.isnum? angle.to_s
|
214
|
+
|
215
|
+
rad = Math::PI * angle.to_f / 180.0
|
216
|
+
s = Matrix.new [[Math.cos(2 * rad), Math.sin(2 * rad), 0], [Math.sin(2 * rad), -Math.cos(2 * rad), 0], [0, 0, 1]]
|
217
|
+
@matrix_op = s
|
218
|
+
cpy = self.to_matrix
|
219
|
+
|
220
|
+
puts "symétrie par rapport à un axe incliné de #{angle.to_f} degrés" if @verbose
|
221
|
+
|
222
|
+
return (s * cpy).to_vector
|
223
|
+
end
|
224
|
+
|
225
|
+
# == Params:
|
226
|
+
# axe::
|
227
|
+
# it must be "x" or "y" (case doesn't checked)
|
228
|
+
#
|
229
|
+
# == Return:
|
230
|
+
# The vector after the projection
|
231
|
+
def proj_axe axe="x"
|
232
|
+
if !axe.match(/[xy]/i)
|
233
|
+
Error.call "Vector::proj_axe '#{axe} is not a valid axe", Error::ERR_HIGH
|
234
|
+
end
|
235
|
+
|
236
|
+
s = nil
|
237
|
+
if axe.match(/x/i)
|
238
|
+
s = Matrix.new [[1, 0, 0], [0, 0, 0], [0, 0, 1]]
|
239
|
+
else
|
240
|
+
s = Matrix.new [[0, 0, 0], [0, 1, 0], [0, 0, 1]]
|
241
|
+
end
|
242
|
+
|
243
|
+
@matrix_op = s
|
244
|
+
cpy = self.to_matrix
|
245
|
+
|
246
|
+
puts "projection sur un axe #{axe}." if @verbose
|
247
|
+
|
248
|
+
return (s * cpy).to_vector
|
249
|
+
end
|
250
|
+
|
251
|
+
# == Params:
|
252
|
+
# nothing
|
253
|
+
# == Return:
|
254
|
+
# The vector after the translation
|
255
|
+
def symetric_pointo
|
256
|
+
return homothétie(-1, -1)
|
257
|
+
end
|
258
|
+
|
259
|
+
# == Parameters:
|
260
|
+
# dim::
|
261
|
+
# Option option to choose the desired number of dimension of the vector (if is it in 3d, it will be flattened)
|
262
|
+
# type::
|
263
|
+
# Optional and not used yet. It specify the format of the string. It may only be String yet.
|
264
|
+
#
|
265
|
+
# == Returns:
|
266
|
+
# String
|
267
|
+
def to_s dim=3, type=String
|
268
|
+
string = ""
|
269
|
+
if type == String
|
270
|
+
if @y == nil or dim == 1
|
271
|
+
string = "(#{@x.to_f.round(3)})"
|
272
|
+
elsif @z == nil or dim == 2
|
273
|
+
string = "(#{@x.to_f.round(3)}; #{@y.to_f.round(3)})"
|
274
|
+
elsif dim == 3
|
275
|
+
string = "(#{@x.to_f.round(3)}; #{@y.to_f.round(3)}; #{@z.to_f.round(3)})"
|
276
|
+
else
|
277
|
+
Error.call "Vector::to_s : Invalid number of dimension specified"
|
278
|
+
end
|
279
|
+
|
280
|
+
else
|
281
|
+
Error.call "Vector::to_s : Invalid type conversion", ERR_HIGH
|
282
|
+
end
|
283
|
+
|
284
|
+
return string
|
285
|
+
end
|
286
|
+
|
287
|
+
# == Parameters:
|
288
|
+
# type::
|
289
|
+
# Optionnal. It specify the format of the array returned. It may be "h" (1) or "w" (0).
|
290
|
+
# * If it's "w" or 0, the Array will be [x,y]
|
291
|
+
# * If it's "h" or 1, the Array returned will be [[x],[y]]
|
292
|
+
#
|
293
|
+
# == Returns:
|
294
|
+
# Array or an Array of Array
|
295
|
+
def to_ary type=0
|
296
|
+
array = []
|
297
|
+
if type == 0 or type == "w" # everytime true... for the moment
|
298
|
+
array << @x << @y
|
299
|
+
if @z != nil
|
300
|
+
array << @z
|
301
|
+
end
|
302
|
+
else
|
303
|
+
array << [@x] << [@y]
|
304
|
+
if @z != nil
|
305
|
+
array << [@z]
|
306
|
+
end
|
307
|
+
end
|
308
|
+
return array
|
309
|
+
end
|
310
|
+
|
311
|
+
# == Parameters::
|
312
|
+
# Nothing
|
313
|
+
#
|
314
|
+
# == Returns:
|
315
|
+
# Matrix
|
316
|
+
def to_matrix
|
317
|
+
return Matrix.new self.to_ary(1)
|
318
|
+
end
|
319
|
+
|
320
|
+
# == Parameters:
|
321
|
+
# type::
|
322
|
+
# It specify the return. It may be String or Array.
|
323
|
+
#
|
324
|
+
# == Returns:
|
325
|
+
# String, Array, nil (see type::)
|
326
|
+
#
|
327
|
+
# == Errors:
|
328
|
+
# nil return occures only if the parameter types:: is not supported.
|
329
|
+
def to_a type=String
|
330
|
+
if type == String
|
331
|
+
return self.to_s
|
332
|
+
elsif type == Array
|
333
|
+
return self.to_ary
|
334
|
+
elsif type == Matrix
|
335
|
+
return self.to_matrix
|
336
|
+
else
|
337
|
+
return nil
|
338
|
+
end
|
339
|
+
end
|
340
|
+
|
341
|
+
def nil?
|
342
|
+
if @x == 0 and @y == 0 and @z == 0
|
343
|
+
true
|
344
|
+
else
|
345
|
+
false
|
346
|
+
end
|
347
|
+
end
|
348
|
+
|
349
|
+
# == Parameters
|
350
|
+
# type::
|
351
|
+
# Verify if two vectors are collinear
|
352
|
+
# == Return:
|
353
|
+
# True if vector u and v are collinear else false
|
354
|
+
def collinear? v
|
355
|
+
Vector::colineaire? @self, v
|
356
|
+
end
|
357
|
+
|
358
|
+
def self.collinear? u, v
|
359
|
+
Error.call "Vector::col : invalid parameters" if !u.is_a?Vector or !v.is_a?Vector
|
360
|
+
Error.call "Vector::col : vector v1 null", Error::ERR_LOW if u.nil?
|
361
|
+
Error.call "Vector::col : vector v2 null", Error::ERR_LOW if v.nil?
|
362
|
+
|
363
|
+
x = u.y * v.z - u.z * v.y
|
364
|
+
y = u.z * v.x - u.x * v.z
|
365
|
+
z = u.x * v.y - u.y * v.x
|
366
|
+
|
367
|
+
if x == 0 and y == 0 and z == 0
|
368
|
+
true
|
369
|
+
else
|
370
|
+
false
|
371
|
+
end
|
372
|
+
end
|
373
|
+
|
374
|
+
end
|
data/lib/epimath100.rb
ADDED
@@ -0,0 +1,11 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
require_relative "epimath100/error.class.rb"
|
4
|
+
require_relative "epimath100/line.class.rb"
|
5
|
+
require_relative "epimath100/matrix.class.rb"
|
6
|
+
require_relative "epimath100/point.class.rb"
|
7
|
+
require_relative "epimath100/polynomial.class.rb"
|
8
|
+
require_relative "epimath100/vector.class.rb"
|
9
|
+
|
10
|
+
class EpiMath100
|
11
|
+
end
|
metadata
ADDED
@@ -0,0 +1,57 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: epimath100
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.6.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- poulet_a
|
8
|
+
- broggi_t
|
9
|
+
- bauwen_j
|
10
|
+
- caudou_j
|
11
|
+
autorequire:
|
12
|
+
bindir: bin
|
13
|
+
cert_chain: []
|
14
|
+
date: 2014-01-18 00:00:00.000000000 Z
|
15
|
+
dependencies: []
|
16
|
+
description: A simple hello world gem
|
17
|
+
email:
|
18
|
+
- poulet_a@epitech.eu
|
19
|
+
- broggi_t@epitech.eu
|
20
|
+
- bauwen_j@epitech.eu
|
21
|
+
- caudou_j@epitech.eu
|
22
|
+
executables: []
|
23
|
+
extensions: []
|
24
|
+
extra_rdoc_files: []
|
25
|
+
files:
|
26
|
+
- lib/epimath100.rb
|
27
|
+
- lib/epimath100/error.class.rb
|
28
|
+
- lib/epimath100/line.class.rb
|
29
|
+
- lib/epimath100/matrix.class.rb
|
30
|
+
- lib/epimath100/point.class.rb
|
31
|
+
- lib/epimath100/polynomial.class.rb
|
32
|
+
- lib/epimath100/vector.class.rb
|
33
|
+
homepage: https://github.com/Sophen/epimath100
|
34
|
+
licenses:
|
35
|
+
- GNU/GPLv3
|
36
|
+
metadata: {}
|
37
|
+
post_install_message:
|
38
|
+
rdoc_options: []
|
39
|
+
require_paths:
|
40
|
+
- lib
|
41
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
42
|
+
requirements:
|
43
|
+
- - '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
47
|
+
requirements:
|
48
|
+
- - '>='
|
49
|
+
- !ruby/object:Gem::Version
|
50
|
+
version: '0'
|
51
|
+
requirements: []
|
52
|
+
rubyforge_project:
|
53
|
+
rubygems_version: 2.0.14
|
54
|
+
signing_key:
|
55
|
+
specification_version: 4
|
56
|
+
summary: EpiMath100, a ruby gem lib to use lines, functions, points, ...
|
57
|
+
test_files: []
|