epimath100 1.7.0 → 2.0.2
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 +4 -4
- data/lib/epimath100/function.class.rb +37 -0
- data/lib/epimath100/line.class.rb +3 -1
- data/lib/epimath100/matrix.class.rb +3 -1
- data/lib/epimath100/point.class.rb +3 -1
- data/lib/epimath100/polynomial.class.rb +59 -79
- data/lib/epimath100/rational.class.rb +62 -0
- data/lib/epimath100/vector.class.rb +312 -310
- data/lib/epimath100.rb +4 -2
- metadata +11 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2858403c795608ec9b39cd293c128f4aa9cf38f1
|
4
|
+
data.tar.gz: f36ad6e002039349af59f7a5054e2d114c206ed3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 17c97f882a7535ab1ca039f51ea545f6d991f7637391f4748500826fa3a3d1a9ce110f42505064367474c8e13c191bce5383f25360508df75bcc539301e72ae6
|
7
|
+
data.tar.gz: dcda0c27dd1baf1de371af4dfc1f59708245a65a9965fbaefacd3a1806c7a3edf4e9abffe898bbf4c51c4341e857bea1cc52a90e2304447d416664ccd3e16606
|
@@ -0,0 +1,37 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
module EpiMath
|
4
|
+
EXPOSANT = {"0" => "⁰",
|
5
|
+
"1" => "¹",
|
6
|
+
"2" => "²",
|
7
|
+
"3" => "³",
|
8
|
+
"4" => "⁴",
|
9
|
+
"5" => "⁵",
|
10
|
+
"6" => "⁶",
|
11
|
+
"7" => "⁷",
|
12
|
+
"8" => "⁸",
|
13
|
+
"9" => "⁹"}
|
14
|
+
|
15
|
+
class Function
|
16
|
+
def calc x
|
17
|
+
return 0
|
18
|
+
end
|
19
|
+
|
20
|
+
def convert_hash hash
|
21
|
+
coef = []
|
22
|
+
hash.select{|k,v| k.to_s.match(/[a-z]/)}.each do |k,v|
|
23
|
+
key = (k.to_s.ord - "a".ord).to_i
|
24
|
+
hash[key] = v if hash[key] == nil
|
25
|
+
end
|
26
|
+
return coef
|
27
|
+
end
|
28
|
+
|
29
|
+
def get_degree_max
|
30
|
+
return @coef.rindex{|x| x != nil}
|
31
|
+
end
|
32
|
+
|
33
|
+
def get_degree x
|
34
|
+
return @coef[x]
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -1,9 +1,10 @@
|
|
1
1
|
#encoding: utf-8
|
2
2
|
|
3
|
-
|
3
|
+
gem 'myerror'
|
4
4
|
require_relative 'point.class.rb'
|
5
5
|
require_relative 'vector.class.rb'
|
6
6
|
|
7
|
+
module EpiMath
|
7
8
|
class Line
|
8
9
|
attr_reader :point, :v_dir, :equ_para
|
9
10
|
|
@@ -103,3 +104,4 @@ class Line
|
|
103
104
|
end
|
104
105
|
|
105
106
|
end
|
107
|
+
end
|
@@ -1,8 +1,9 @@
|
|
1
1
|
#encoding: utf-8
|
2
2
|
|
3
|
-
|
3
|
+
gem 'myerror'
|
4
4
|
require_relative 'vector.class'
|
5
5
|
|
6
|
+
module EpiMath
|
6
7
|
# TODO : improve the documentation
|
7
8
|
class Matrix
|
8
9
|
attr_reader :columns, :lines, :v
|
@@ -305,3 +306,4 @@ class Matrix
|
|
305
306
|
end
|
306
307
|
|
307
308
|
end
|
309
|
+
end
|
@@ -1,96 +1,76 @@
|
|
1
1
|
#encoding: utf-8
|
2
2
|
|
3
|
-
|
4
|
-
require_relative '
|
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
|
-
# 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
|
3
|
+
gem 'myerror'
|
4
|
+
require_relative 'function.class'
|
5
|
+
|
6
|
+
module EpiMath
|
7
|
+
class Polynomial < Function
|
8
|
+
|
9
|
+
attr_accessor :coef, :verb
|
10
|
+
|
11
|
+
# Initialize the polynominal function
|
12
|
+
# Its coeficients are 1, 2, 3, 4 ... with '1'x⁰ + '2'x¹ + '3'x² ... = y
|
13
|
+
# Each coeficients has an associated value (exemple : 2 => 1 correspond to 1x²)
|
14
|
+
# exemple :
|
15
|
+
# a = [] ; a[2] = 1 ; #correspond to 0 + 0x + 2x³
|
16
|
+
#
|
17
|
+
# == Parameters:
|
18
|
+
# coef::
|
19
|
+
# coef is an array which have several keys 0, 1, 2,... which correspond to the coeficients
|
20
|
+
# verb:: default is false
|
21
|
+
# It will display more information if turned on when to_s.
|
22
|
+
# It's a integer, it must be in the list :
|
23
|
+
# - 0 : returns ""
|
24
|
+
# - 1 : "y = equation"
|
25
|
+
# - 2 : "f(x) = equation" (default value)
|
26
|
+
def initialize coef=[], verb=0
|
27
|
+
Error.call "Polynomial::new : Your coef is invalid" if !coef.is_a?Hash and !coef.is_a?Array
|
28
|
+
coef = convert_hash(coef) if coef.is_a?Hash
|
29
|
+
@coef = coef.select{|v| v.is_a?Numeric}
|
30
|
+
@verbose = 2
|
41
31
|
end
|
42
32
|
|
43
|
-
|
44
|
-
|
45
|
-
|
33
|
+
#calculate the derivated function of the current polynomial
|
34
|
+
# == Returns:
|
35
|
+
# Polynomial (the derivated function)
|
36
|
+
def derive
|
37
|
+
dérivé = Polynomial.new
|
46
38
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
39
|
+
if @coef.size > 0
|
40
|
+
(1..(@coef.size)).times do |coef|
|
41
|
+
dérivé.coef[coef - 1] = dérivé[coef] * coef
|
42
|
+
end
|
43
|
+
end
|
52
44
|
|
53
|
-
|
54
|
-
dérivé.coef[coef - 1] = value * coef
|
45
|
+
return dérivé
|
55
46
|
end
|
56
47
|
|
57
|
-
|
58
|
-
|
48
|
+
def to_s
|
49
|
+
str = ""
|
50
|
+
str = "#{@coef[0].to_i}" + str #if @coef[:a]
|
59
51
|
|
60
|
-
|
61
|
-
|
52
|
+
if @coef.size > 0
|
53
|
+
(1..(@coef.size)).each do |coef|
|
54
|
+
#sign = "+"
|
55
|
+
#sign = "-" if value < 0
|
56
|
+
str = "#{@coef[coef]}x^#{coef} + " + str if @coef[coef].to_f != 0
|
57
|
+
end
|
58
|
+
end
|
62
59
|
|
63
|
-
|
64
|
-
|
60
|
+
str = "f(x) = " + str if @verb == 2
|
61
|
+
str = "y = " + str if @verb == 1
|
65
62
|
|
66
|
-
|
67
|
-
#sign = "+"
|
68
|
-
#sign = "-" if value < 0
|
69
|
-
str = "#{value}x^#{coef} + " + str if value != 0
|
63
|
+
return str
|
70
64
|
end
|
71
|
-
str = "f(x) = " + str if @verbose == true or @verbose == 2
|
72
|
-
str = "y = " + str if @verbose == 1
|
73
65
|
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
y = 0
|
82
|
-
@coef.each do |coef,value|
|
83
|
-
y += value * x**coef
|
66
|
+
# Calculate the value of f(x) from x
|
67
|
+
def calc x
|
68
|
+
y = 0
|
69
|
+
[@coef.size].max.times do |coef|
|
70
|
+
y += @coef[coef] * x**coef
|
71
|
+
end
|
72
|
+
return y
|
84
73
|
end
|
85
74
|
|
86
|
-
return y
|
87
|
-
end
|
88
|
-
|
89
|
-
def get_degree_max
|
90
|
-
return @coef.keys.max
|
91
|
-
end
|
92
|
-
|
93
|
-
def get_degree x
|
94
|
-
return @coef[x]
|
95
75
|
end
|
96
76
|
end
|
@@ -0,0 +1,62 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
|
3
|
+
gem 'myerror'
|
4
|
+
require_relative 'function.class'
|
5
|
+
require_relative 'polynomial.class'
|
6
|
+
|
7
|
+
module EpiMath
|
8
|
+
class Rational < Function
|
9
|
+
attr_accessor :verbose
|
10
|
+
|
11
|
+
def initialize poly=Polynomial.new, div=Polynomial.new([1]), verb=2
|
12
|
+
#Error.call "Rational::new : Your poly are invalid" if !poly.is_a?Polynomial
|
13
|
+
Error.call "Rational::new : Your divider are invalid" if !div.is_a?Polynomial
|
14
|
+
@poly = poly #todo : check each element of the array (hash to use select ?)
|
15
|
+
@poly.verb = 0
|
16
|
+
@div = div
|
17
|
+
@div.verb = 0
|
18
|
+
@verb = verb
|
19
|
+
end
|
20
|
+
|
21
|
+
def derive
|
22
|
+
return nil
|
23
|
+
end
|
24
|
+
|
25
|
+
def to_s
|
26
|
+
max_space = [@poly.to_s.size, @div.to_s.size].max
|
27
|
+
top_space = (max_space - @poly.to_s.size) / 2
|
28
|
+
bot_space = (max_space - @div.to_s.size) / 2
|
29
|
+
|
30
|
+
string = " #{" " * top_space}#{@poly.to_s}\n"
|
31
|
+
string += "f(x) = #{"-" * max_space}"
|
32
|
+
string << "\n #{" " * bot_space}#{@div.to_s}"
|
33
|
+
return string
|
34
|
+
end
|
35
|
+
|
36
|
+
def calc x
|
37
|
+
Error.call "Rational::calc: x is not a Numeric value" if !x.is_a?Numeric
|
38
|
+
|
39
|
+
p = @poly.calc x
|
40
|
+
q = @div.calc x
|
41
|
+
return 0 if q == 0
|
42
|
+
return p / q
|
43
|
+
end
|
44
|
+
|
45
|
+
#accessors
|
46
|
+
def poly= p
|
47
|
+
Error.call "Rational::new : Your poly are invalid" if !p.is_a?Polynomial
|
48
|
+
@poly = p
|
49
|
+
end
|
50
|
+
def div= p
|
51
|
+
Error.call "Rational::new : Your divider are invalid" if !p.is_a?Polynomial
|
52
|
+
@div = p
|
53
|
+
end
|
54
|
+
def poly
|
55
|
+
@poly
|
56
|
+
end
|
57
|
+
def div
|
58
|
+
@div
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
end
|
@@ -1,374 +1,376 @@
|
|
1
1
|
#encoding: utf-8
|
2
2
|
|
3
|
-
|
3
|
+
gem 'myerror'
|
4
4
|
require_relative 'matrix.class'
|
5
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
|
-
par3
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
Error.
|
6
|
+
module EpiMath
|
7
|
+
class Vector
|
8
|
+
attr_accessor :x, :y, :z, :verbose
|
9
|
+
attr_reader :matrix_op
|
10
|
+
|
11
|
+
# == Parameters:
|
12
|
+
# par1::
|
13
|
+
# The first parameter may be a point coordonate x, or a other Vector.
|
14
|
+
# 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.
|
15
|
+
# par2,par3::
|
16
|
+
# Theses optionals parameters are used if the first parameter is not a Vector. If it occure, par2 is mandatory (but not par3).
|
17
|
+
# They will be stored in @y and @z.
|
18
|
+
# verbose::
|
19
|
+
# verbose turn on/off the messages with translate, rotate, ...
|
20
|
+
#
|
21
|
+
# == Returns:
|
22
|
+
# himself
|
23
|
+
#
|
24
|
+
# == Errors::
|
25
|
+
# If a parameter is invalid, it may be crash the programm with an ERR_HIGH
|
26
|
+
def initialize par1, par2=nil, par3=nil, verbose=true
|
27
|
+
if par1.is_a?Vector #and par2 == nil and par3 == nil
|
28
|
+
@x = par1.x
|
29
|
+
@y = par1.y
|
30
|
+
@z = par1.z
|
31
|
+
|
32
|
+
elsif par1 != nil and par2 != nil
|
33
|
+
if par3 == nil
|
34
|
+
par3 = 1.0
|
35
|
+
end
|
36
|
+
|
37
|
+
if !Error.isnum?par1 or !Error.isnum?par2 or !Error.isnum?par3
|
38
|
+
Error.call "Vector::new : a passed argument is not a valid number"
|
39
|
+
end
|
40
|
+
|
41
|
+
@x = par1.to_f
|
42
|
+
@y = par2.to_f
|
43
|
+
@z = par3.to_f
|
44
|
+
else
|
45
|
+
Error.call "Vector::new : The vector couldn't be initialisze with theses parameters : :par1 => '#{par1}', :par2 => '#{par2}'"
|
38
46
|
end
|
39
47
|
|
40
|
-
@
|
41
|
-
@
|
42
|
-
|
43
|
-
else
|
44
|
-
Error.call "Vector::new : The vector couldn't be initialisze with theses parameters : :par1 => '#{par1}', :par2 => '#{par2}'"
|
48
|
+
@verbose = verbose
|
49
|
+
@matrix_op = init_matrix_op
|
50
|
+
return self
|
45
51
|
end
|
46
52
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
# Return to the norm of the currenet vector
|
53
|
-
def norm
|
54
|
-
Math.sqrt(@x**2 + @y**2 + @z**2)
|
55
|
-
end
|
53
|
+
# Return to the norm of the currenet vector
|
54
|
+
def norm
|
55
|
+
Math.sqrt(@x**2 + @y**2 + @z**2)
|
56
|
+
end
|
56
57
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
58
|
+
# == Returns:
|
59
|
+
# Matrix.new [[1, 0, 0],[0, 1, 0], [0, 0, 1]]
|
60
|
+
def init_matrix_op
|
61
|
+
@matrix_op = Matrix.new [[1, 0, 0],[0, 1, 0], [0, 0, 1]]
|
62
|
+
end
|
62
63
|
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
64
|
+
# == Parameters:
|
65
|
+
# par1::
|
66
|
+
# It may be a point coordonate x, or a other Vector.
|
67
|
+
# 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
|
68
|
+
#
|
69
|
+
# == Returns:
|
70
|
+
# nothing
|
71
|
+
#
|
72
|
+
# == Errors::
|
73
|
+
# If a parameter is invalid, it may be crash the programm with an ERR_HIGH
|
74
|
+
# If the vectors do not have the same dimensions, it will display a warning
|
75
|
+
def +(par1)
|
76
|
+
out = Vector.new(self)
|
77
|
+
|
78
|
+
if par1 != nil and par1.is_a?Vector #and par2 == nil and par3 == nil
|
79
|
+
out.x += par1.x
|
80
|
+
out.y += par1.y
|
81
|
+
|
82
|
+
elsif par1 != nil
|
83
|
+
par1 = par1.to_f
|
84
|
+
out.x += par1
|
85
|
+
out.y += par1
|
86
|
+
|
87
|
+
if out.z != nil and par1 == nil
|
88
|
+
Error.call "The vector #{Vector.new(par1, par1, par1).to_s} do not have the same dimensions than #{out.to_s}", Error::ERR_HIGH
|
89
|
+
elsif out.z != nil
|
90
|
+
out.z += par1
|
91
|
+
end
|
92
|
+
else
|
93
|
+
Error.call "The vector couldn't be added with this parameters : #{par1}", Error::ERR_HIGH
|
90
94
|
end
|
91
|
-
|
92
|
-
Error.call "The vector couldn't be added with this parameters : #{par1}", Error::ERR_HIGH
|
95
|
+
return out
|
93
96
|
end
|
94
|
-
return out
|
95
|
-
end
|
96
97
|
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
98
|
+
# == Usage:
|
99
|
+
# It is simply like + buf multiply by -1 par1
|
100
|
+
def -(par1)
|
101
|
+
if par1 == nil
|
102
|
+
Error.call "Can't sub nil from vector"
|
103
|
+
end
|
104
|
+
return (self.+(par1 * -1))
|
102
105
|
end
|
103
|
-
return (self.+(par1 * -1))
|
104
|
-
end
|
105
106
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
107
|
+
# == Parameters:
|
108
|
+
# par1:
|
109
|
+
# This parameter may be a Vector or a number. If it's a Number, it will multiply all coponents of the Vector.
|
110
|
+
# If it's an other vector, we will multiplie their components 2by2
|
111
|
+
# == Returns:
|
112
|
+
# Vector
|
113
|
+
def *(par1)
|
114
|
+
out = Vector.new(self)
|
115
|
+
if par1.is_a?Numeric
|
116
|
+
out.x *= par1
|
117
|
+
out.y *= par1
|
118
|
+
if out.z != nil
|
119
|
+
out.z *= par1
|
120
|
+
end
|
121
|
+
elsif par1.is_a?Matrix
|
121
122
|
return (self.to_matrix * par1).to_vector
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
123
|
+
elsif par1.is_a?Vector
|
124
|
+
ary1 = [self.x, self.y]
|
125
|
+
if out.z != nil
|
126
|
+
ary1 << out.z
|
127
|
+
end
|
128
|
+
|
129
|
+
ary2 = [par1.x, par1.y]
|
130
|
+
if out.z != nil
|
131
|
+
ary2 << par1.z
|
132
|
+
end
|
133
|
+
|
134
|
+
aryr = Matrix.mult_array(ary1, ary2)
|
135
|
+
out.x = aryr[0]
|
136
|
+
out.y = aryr[1]
|
137
|
+
if aryr[2] != nil
|
138
|
+
out.z = aryr[2]
|
139
|
+
end
|
140
|
+
else
|
141
|
+
Error.call "Unable to add '#{par1} to this vector", Error::ERR_HIGH
|
126
142
|
end
|
143
|
+
return out
|
144
|
+
end
|
127
145
|
|
128
|
-
|
129
|
-
|
130
|
-
|
146
|
+
# == Parameters:
|
147
|
+
# par1, par2::
|
148
|
+
# They are the components of the vector to translate.
|
149
|
+
# par3::
|
150
|
+
# Optional component (z)
|
151
|
+
# see +::
|
152
|
+
def translate par1, par2, par3=0.0
|
153
|
+
if !Error.isnum? par1 or !Error.isnum? par2 or !Error.isnum? par3
|
154
|
+
Error.call "A parameter to the translation is not a valid number", Error::ERR_HIGH
|
131
155
|
end
|
132
156
|
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
else
|
140
|
-
Error.call "Unable to add '#{par1} to this vector", Error::ERR_HIGH
|
141
|
-
end
|
142
|
-
return out
|
143
|
-
end
|
157
|
+
s = Matrix.new [[1.0, 0.0, par1.to_f], [0.0, 1.0, par2.to_f], [0.0, 0.0, 1.0]]
|
158
|
+
@matrix_op = s
|
159
|
+
cpy = self
|
160
|
+
cpy.z = 1.0
|
161
|
+
|
162
|
+
puts "translation de vecteur #{Vector.new(par1,par2,par3).to_s}" if @verbose
|
144
163
|
|
145
|
-
|
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
|
164
|
+
return (s * cpy.to_matrix).to_vector
|
154
165
|
end
|
155
166
|
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
167
|
+
# == Parameters:
|
168
|
+
# c1,c2,c3::
|
169
|
+
# c1 and c2 are the coeficiens of the homothetie. c3 is optional
|
170
|
+
def homothétie c1, c2, c3=1.0
|
171
|
+
if c1 == nil or c2 == nil
|
172
|
+
Error.call "Coefficients are invalids"
|
173
|
+
end
|
160
174
|
|
161
|
-
|
175
|
+
s = Matrix.new [[c1.to_f, 0, 0], [0, c2.to_f, 0], [0, 0, c3.to_f]]
|
176
|
+
@matrix_op = s
|
177
|
+
cpy = self
|
178
|
+
cpy.z = 1.0
|
162
179
|
|
163
|
-
|
164
|
-
end
|
180
|
+
puts "homothétie de rapports #{c1.to_f}, #{c2.to_f}" if @verbose
|
165
181
|
|
166
|
-
|
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"
|
182
|
+
return (s * cpy.to_matrix).to_vector
|
172
183
|
end
|
173
184
|
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
185
|
+
# == Parameters:
|
186
|
+
# a::
|
187
|
+
# The angle in degree
|
188
|
+
#
|
189
|
+
# == Return value:
|
190
|
+
# It returns the vector after the translation.
|
191
|
+
def rotate a
|
192
|
+
if a == nil
|
193
|
+
Error.call "Angle is invalid"
|
194
|
+
end
|
178
195
|
|
179
|
-
|
196
|
+
rad = Math::PI * a.to_f / 180.0
|
197
|
+
cpy = self # copy to have the same value in z
|
198
|
+
cpy.z = 0.0
|
199
|
+
s = Matrix.new [[ Math.cos(rad), -Math.sin(rad), 0], [Math.sin(rad), Math.cos(rad), 0], [0, 0, 1]]
|
200
|
+
@matrix_op = s
|
180
201
|
|
181
|
-
|
182
|
-
end
|
202
|
+
puts "rotation d'angle #{a.to_f}" if @verbose
|
183
203
|
|
184
|
-
|
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"
|
204
|
+
return (s * cpy.to_matrix).to_vector
|
193
205
|
end
|
194
206
|
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
207
|
+
# == Parameters :
|
208
|
+
# angle::
|
209
|
+
# It is the incline of the line.
|
210
|
+
#
|
211
|
+
# == Return value:
|
212
|
+
# It returns the vector after the translation.
|
213
|
+
def symetric angle
|
214
|
+
Error.call "Variable angle is not a number (#{angle})", Error::ERR_HIGH if !Error.isnum? angle.to_s
|
200
215
|
|
201
|
-
|
216
|
+
rad = Math::PI * angle.to_f / 180.0
|
217
|
+
s = Matrix.new [[Math.cos(2 * rad), Math.sin(2 * rad), 0], [Math.sin(2 * rad), -Math.cos(2 * rad), 0], [0, 0, 1]]
|
218
|
+
@matrix_op = s
|
219
|
+
cpy = self.to_matrix
|
202
220
|
|
203
|
-
|
204
|
-
end
|
221
|
+
puts "symétrie par rapport à un axe incliné de #{angle.to_f} degrés" if @verbose
|
205
222
|
|
206
|
-
|
207
|
-
|
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
|
223
|
+
return (s * cpy).to_vector
|
224
|
+
end
|
214
225
|
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
226
|
+
# == Params:
|
227
|
+
# axe::
|
228
|
+
# it must be "x" or "y" (case doesn't checked)
|
229
|
+
#
|
230
|
+
# == Return:
|
231
|
+
# The vector after the projection
|
232
|
+
def proj_axe axe="x"
|
233
|
+
if !axe.match(/[xy]/i)
|
234
|
+
Error.call "Vector::proj_axe '#{axe} is not a valid axe", Error::ERR_HIGH
|
235
|
+
end
|
219
236
|
|
220
|
-
|
237
|
+
s = nil
|
238
|
+
if axe.match(/x/i)
|
239
|
+
s = Matrix.new [[1, 0, 0], [0, 0, 0], [0, 0, 1]]
|
240
|
+
else
|
241
|
+
s = Matrix.new [[0, 0, 0], [0, 1, 0], [0, 0, 1]]
|
242
|
+
end
|
221
243
|
|
222
|
-
|
223
|
-
|
244
|
+
@matrix_op = s
|
245
|
+
cpy = self.to_matrix
|
224
246
|
|
225
|
-
|
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
|
247
|
+
puts "projection sur un axe #{axe}." if @verbose
|
235
248
|
|
236
|
-
|
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]]
|
249
|
+
return (s * cpy).to_vector
|
241
250
|
end
|
242
251
|
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
252
|
+
# == Params:
|
253
|
+
# nothing
|
254
|
+
# == Return:
|
255
|
+
# The vector after the translation
|
256
|
+
def symetric_pointo
|
257
|
+
return homothétie(-1, -1)
|
258
|
+
end
|
250
259
|
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
260
|
+
# == Parameters:
|
261
|
+
# dim::
|
262
|
+
# Option option to choose the desired number of dimension of the vector (if is it in 3d, it will be flattened)
|
263
|
+
# type::
|
264
|
+
# Optional and not used yet. It specify the format of the string. It may only be String yet.
|
265
|
+
#
|
266
|
+
# == Returns:
|
267
|
+
# String
|
268
|
+
def to_s dim=3, type=String
|
269
|
+
string = ""
|
270
|
+
if type == String
|
271
|
+
if @y == nil or dim == 1
|
272
|
+
string = "(#{@x.to_f.round(3)})"
|
273
|
+
elsif @z == nil or dim == 2
|
274
|
+
string = "(#{@x.to_f.round(3)}; #{@y.to_f.round(3)})"
|
275
|
+
elsif dim == 3
|
276
|
+
string = "(#{@x.to_f.round(3)}; #{@y.to_f.round(3)}; #{@z.to_f.round(3)})"
|
277
|
+
else
|
278
|
+
Error.call "Vector::to_s : Invalid number of dimension specified"
|
279
|
+
end
|
258
280
|
|
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
281
|
else
|
277
|
-
Error.call "Vector::to_s : Invalid
|
282
|
+
Error.call "Vector::to_s : Invalid type conversion", ERR_HIGH
|
278
283
|
end
|
279
284
|
|
280
|
-
|
281
|
-
Error.call "Vector::to_s : Invalid type conversion", ERR_HIGH
|
285
|
+
return string
|
282
286
|
end
|
283
287
|
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
array << @
|
301
|
-
|
302
|
-
|
303
|
-
|
304
|
-
if @z != nil
|
305
|
-
array << [@z]
|
288
|
+
# == Parameters:
|
289
|
+
# type::
|
290
|
+
# Optionnal. It specify the format of the array returned. It may be "h" (1) or "w" (0).
|
291
|
+
# * If it's "w" or 0, the Array will be [x,y]
|
292
|
+
# * If it's "h" or 1, the Array returned will be [[x],[y]]
|
293
|
+
#
|
294
|
+
# == Returns:
|
295
|
+
# Array or an Array of Array
|
296
|
+
def to_ary type=0
|
297
|
+
array = []
|
298
|
+
if type == 0 or type == "w" # everytime true... for the moment
|
299
|
+
array << @x << @y
|
300
|
+
if @z != nil
|
301
|
+
array << @z
|
302
|
+
end
|
303
|
+
else
|
304
|
+
array << [@x] << [@y]
|
305
|
+
if @z != nil
|
306
|
+
array << [@z]
|
307
|
+
end
|
306
308
|
end
|
309
|
+
return array
|
307
310
|
end
|
308
|
-
return array
|
309
|
-
end
|
310
311
|
|
311
|
-
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
312
|
+
# == Parameters::
|
313
|
+
# Nothing
|
314
|
+
#
|
315
|
+
# == Returns:
|
316
|
+
# Matrix
|
317
|
+
def to_matrix
|
318
|
+
return Matrix.new self.to_ary(1)
|
319
|
+
end
|
319
320
|
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
|
321
|
+
# == Parameters:
|
322
|
+
# type::
|
323
|
+
# It specify the return. It may be String or Array.
|
324
|
+
#
|
325
|
+
# == Returns:
|
326
|
+
# String, Array, nil (see type::)
|
327
|
+
#
|
328
|
+
# == Errors:
|
329
|
+
# nil return occures only if the parameter types:: is not supported.
|
330
|
+
def to_a type=String
|
331
|
+
if type == String
|
332
|
+
return self.to_s
|
333
|
+
elsif type == Array
|
334
|
+
return self.to_ary
|
335
|
+
elsif type == Matrix
|
336
|
+
return self.to_matrix
|
337
|
+
else
|
338
|
+
return nil
|
339
|
+
end
|
338
340
|
end
|
339
|
-
end
|
340
341
|
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
342
|
+
def nil?
|
343
|
+
if @x == 0 and @y == 0 and @z == 0
|
344
|
+
true
|
345
|
+
else
|
346
|
+
false
|
347
|
+
end
|
346
348
|
end
|
347
|
-
end
|
348
349
|
|
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
|
-
|
355
|
-
|
356
|
-
|
350
|
+
# == Parameters
|
351
|
+
# type::
|
352
|
+
# Verify if two vectors are collinear
|
353
|
+
# == Return:
|
354
|
+
# True if vector u and v are collinear else false
|
355
|
+
def collinear? v
|
356
|
+
Vector::colineaire? @self, v
|
357
|
+
end
|
357
358
|
|
358
|
-
|
359
|
-
|
360
|
-
|
361
|
-
|
359
|
+
def self.collinear? u, v
|
360
|
+
Error.call "Vector::col : invalid parameters" if !u.is_a?Vector or !v.is_a?Vector
|
361
|
+
Error.call "Vector::col : vector v1 null", Error::ERR_LOW if u.nil?
|
362
|
+
Error.call "Vector::col : vector v2 null", Error::ERR_LOW if v.nil?
|
362
363
|
|
363
|
-
|
364
|
-
|
365
|
-
|
364
|
+
x = u.y * v.z - u.z * v.y
|
365
|
+
y = u.z * v.x - u.x * v.z
|
366
|
+
z = u.x * v.y - u.y * v.x
|
366
367
|
|
367
|
-
|
368
|
-
|
369
|
-
|
370
|
-
|
368
|
+
if x == 0 and y == 0 and z == 0
|
369
|
+
true
|
370
|
+
else
|
371
|
+
false
|
372
|
+
end
|
371
373
|
end
|
372
|
-
end
|
373
374
|
|
375
|
+
end
|
374
376
|
end
|
data/lib/epimath100.rb
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
#encoding: utf-8
|
2
2
|
|
3
|
-
|
3
|
+
gem "myerror"
|
4
4
|
require_relative "epimath100/line.class.rb"
|
5
5
|
require_relative "epimath100/matrix.class.rb"
|
6
6
|
require_relative "epimath100/point.class.rb"
|
7
|
+
require_relative "epimath100/function.class.rb"
|
7
8
|
require_relative "epimath100/polynomial.class.rb"
|
9
|
+
require_relative "epimath100/rational.class.rb"
|
8
10
|
require_relative "epimath100/vector.class.rb"
|
9
11
|
|
10
|
-
|
12
|
+
module EpiMath
|
11
13
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: epimath100
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- poulet_a
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2014-
|
14
|
+
date: 2014-03-08 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: myerror
|
@@ -19,7 +19,7 @@ dependencies:
|
|
19
19
|
requirements:
|
20
20
|
- - "~>"
|
21
21
|
- !ruby/object:Gem::Version
|
22
|
-
version: 1.
|
22
|
+
version: 1.1.0
|
23
23
|
- - ">="
|
24
24
|
- !ruby/object:Gem::Version
|
25
25
|
version: 1.0.0
|
@@ -29,28 +29,32 @@ dependencies:
|
|
29
29
|
requirements:
|
30
30
|
- - "~>"
|
31
31
|
- !ruby/object:Gem::Version
|
32
|
-
version: 1.
|
32
|
+
version: 1.1.0
|
33
33
|
- - ">="
|
34
34
|
- !ruby/object:Gem::Version
|
35
35
|
version: 1.0.0
|
36
|
-
description:
|
36
|
+
description: EpiMath100, a ruby gem lib to use lines, functions, points, ...
|
37
37
|
email:
|
38
38
|
- poulet_a@epitech.eu
|
39
39
|
- - lib/epimath100.rb
|
40
40
|
- lib/epimath100/line.class.rb
|
41
41
|
- lib/epimath100/matrix.class.rb
|
42
42
|
- lib/epimath100/point.class.rb
|
43
|
+
- lib/epimath100/function.class.rb
|
43
44
|
- lib/epimath100/polynomial.class.rb
|
45
|
+
- lib/epimath100/rational.class.rb
|
44
46
|
- lib/epimath100/vector.class.rb
|
45
47
|
executables: []
|
46
48
|
extensions: []
|
47
49
|
extra_rdoc_files: []
|
48
50
|
files:
|
49
51
|
- lib/epimath100.rb
|
52
|
+
- lib/epimath100/function.class.rb
|
50
53
|
- lib/epimath100/line.class.rb
|
51
54
|
- lib/epimath100/matrix.class.rb
|
52
55
|
- lib/epimath100/point.class.rb
|
53
56
|
- lib/epimath100/polynomial.class.rb
|
57
|
+
- lib/epimath100/rational.class.rb
|
54
58
|
- lib/epimath100/vector.class.rb
|
55
59
|
homepage: https://github.com/Sophen/epimath100
|
56
60
|
licenses:
|
@@ -72,9 +76,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
72
76
|
version: '0'
|
73
77
|
requirements: []
|
74
78
|
rubyforge_project:
|
75
|
-
rubygems_version: 2.2.
|
79
|
+
rubygems_version: 2.2.2
|
76
80
|
signing_key:
|
77
81
|
specification_version: 4
|
78
|
-
summary:
|
82
|
+
summary: Fix function
|
79
83
|
test_files: []
|
80
84
|
has_rdoc:
|