cartesius 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/cartesius/angle.rb +95 -0
- data/lib/cartesius/circumference.rb +6 -6
- data/lib/cartesius/ellipse.rb +5 -5
- data/lib/cartesius/hyperbola.rb +5 -5
- data/lib/cartesius/line.rb +48 -35
- data/lib/cartesius/parabola.rb +6 -6
- data/lib/cartesius/point.rb +11 -12
- data/lib/cartesius/segment.rb +8 -9
- data/lib/cartesius/triangle.rb +106 -0
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 69e7a9e2b6c6f4edb2bcc0cd73e5f909ee2eed07
|
4
|
+
data.tar.gz: 4eda3671a45184320a8485a0bd389df017bc8b8f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 005e1721917eb39048995f4567a084c53ec9bdc66f2d95ca78ae2a827ae9bb19561747072ac257f697c46d2fc572e2a4175c897feedd929408a7d1fe438cbc8b
|
7
|
+
data.tar.gz: 01db7a237a5fa5edc13314dee6503120f9e232f65665e1cba2a3c9d830c1d9bbf68da95f367bc634e3af493d51b3e004eff202b9f4250665504e212643a8c8b0
|
@@ -0,0 +1,95 @@
|
|
1
|
+
module Cartesius
|
2
|
+
class Angle
|
3
|
+
NULL, RIGHT, FLAT, FULL = 0, 90, 180, 360
|
4
|
+
private_constant(:NULL)
|
5
|
+
private_constant(:RIGHT)
|
6
|
+
private_constant(:FLAT)
|
7
|
+
private_constant(:FULL)
|
8
|
+
|
9
|
+
def initialize(angle)
|
10
|
+
@angle = angle
|
11
|
+
end
|
12
|
+
|
13
|
+
private_class_method(:new)
|
14
|
+
|
15
|
+
def self.by_degrees(degrees)
|
16
|
+
new(degrees)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.by_radiants(radiants)
|
20
|
+
by_degrees(radiants * FLAT / Math::PI)
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.by_lines(line1:, line2:)
|
24
|
+
raise ArgumentError.new('Lines must not be parallel!') if line1.parallel?(line2)
|
25
|
+
if line1.perpendicular?(line2)
|
26
|
+
[right, right]
|
27
|
+
else
|
28
|
+
acute = by_radiants(Math.atan(line1.slope - line2.slope / 1 + line1.slope * line2.slope).abs)
|
29
|
+
[acute, new(FLAT - acute.degrees)]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def self.null
|
34
|
+
by_degrees(NULL)
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.right
|
38
|
+
by_degrees(RIGHT)
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.flat
|
42
|
+
by_degrees(FLAT)
|
43
|
+
end
|
44
|
+
|
45
|
+
def self.full
|
46
|
+
by_degrees(FULL)
|
47
|
+
end
|
48
|
+
|
49
|
+
def degrees(precision = 3)
|
50
|
+
@angle.round(precision)
|
51
|
+
end
|
52
|
+
|
53
|
+
def radiants(precision = 3)
|
54
|
+
(@angle * Math::PI / FLAT).round(precision)
|
55
|
+
end
|
56
|
+
|
57
|
+
def null?
|
58
|
+
degrees == NULL
|
59
|
+
end
|
60
|
+
|
61
|
+
def acute?
|
62
|
+
degrees > NULL and degrees < RIGHT
|
63
|
+
end
|
64
|
+
|
65
|
+
def right?
|
66
|
+
degrees == RIGHT
|
67
|
+
end
|
68
|
+
|
69
|
+
def obtuse?
|
70
|
+
degrees > RIGHT and degrees < FLAT
|
71
|
+
end
|
72
|
+
|
73
|
+
def flat?
|
74
|
+
degrees == FLAT
|
75
|
+
end
|
76
|
+
|
77
|
+
def full?
|
78
|
+
degrees == FULL
|
79
|
+
end
|
80
|
+
|
81
|
+
def congruent?(angle)
|
82
|
+
angle.instance_of?(self.class) and
|
83
|
+
angle.degrees == degrees
|
84
|
+
end
|
85
|
+
|
86
|
+
alias_method(:eql?, :congruent?)
|
87
|
+
|
88
|
+
private
|
89
|
+
|
90
|
+
def hash
|
91
|
+
@angle.hash
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
end
|
@@ -37,7 +37,7 @@ module Cartesius
|
|
37
37
|
[point3.x, point3.y, 1],
|
38
38
|
[-(point1.x ** 2 + point1.y ** 2), -(point2.x ** 2 + point2.y ** 2), -(point3.x ** 2 + point3.y ** 2)]
|
39
39
|
)
|
40
|
-
|
40
|
+
new(x: alfa, y: beta, k: gamma)
|
41
41
|
rescue
|
42
42
|
raise ArgumentError.new('Invalid points!')
|
43
43
|
end
|
@@ -59,17 +59,17 @@ module Cartesius
|
|
59
59
|
end
|
60
60
|
|
61
61
|
def congruent?(circumference)
|
62
|
-
circumference.instance_of?(
|
63
|
-
circumference.radius ==
|
62
|
+
circumference.instance_of?(self.class) and
|
63
|
+
circumference.radius == radius
|
64
64
|
end
|
65
65
|
|
66
66
|
def == (circumference)
|
67
|
-
circumference.instance_of?(
|
68
|
-
circumference.center ==
|
67
|
+
circumference.instance_of?(self.class) and
|
68
|
+
circumference.center == center and circumference.radius == radius
|
69
69
|
end
|
70
70
|
|
71
71
|
def self.build_by(center, radius)
|
72
|
-
|
72
|
+
new(x: -2 * center.x, y: -2 * center.y, k: center.x ** 2 + center.y ** 2 - radius.to_r ** 2)
|
73
73
|
end
|
74
74
|
|
75
75
|
private_class_method(:build_by)
|
data/lib/cartesius/ellipse.rb
CHANGED
@@ -151,17 +151,17 @@ module Cartesius
|
|
151
151
|
end
|
152
152
|
|
153
153
|
def congruent?(ellipse)
|
154
|
-
ellipse.instance_of?(
|
155
|
-
ellipse.eccentricity ==
|
154
|
+
ellipse.instance_of?(self.class) and
|
155
|
+
ellipse.eccentricity == eccentricity
|
156
156
|
end
|
157
157
|
|
158
158
|
def == (ellipse)
|
159
|
-
ellipse.instance_of?(
|
160
|
-
ellipse.focus1 ==
|
159
|
+
ellipse.instance_of?(self.class) and
|
160
|
+
ellipse.focus1 == focus1 and ellipse.focus2 == focus2 and ellipse.distance == distance
|
161
161
|
end
|
162
162
|
|
163
163
|
def self.build_by(a2, b2, center)
|
164
|
-
|
164
|
+
new(x2: b2, y2: a2, x: -2 * b2 * center.x, y: -2 * a2 * center.y, k: b2 * center.x ** 2 + a2 * center.y ** 2 - a2 * b2)
|
165
165
|
end
|
166
166
|
|
167
167
|
private_class_method(:build_by)
|
data/lib/cartesius/hyperbola.rb
CHANGED
@@ -181,17 +181,17 @@ module Cartesius
|
|
181
181
|
end
|
182
182
|
|
183
183
|
def congruent?(hyperbola)
|
184
|
-
hyperbola.instance_of?(
|
185
|
-
hyperbola.eccentricity ==
|
184
|
+
hyperbola.instance_of?(self.class) and
|
185
|
+
hyperbola.eccentricity == eccentricity
|
186
186
|
end
|
187
187
|
|
188
188
|
def == (hyperbola)
|
189
|
-
hyperbola.instance_of?(
|
190
|
-
hyperbola.focus1 ==
|
189
|
+
hyperbola.instance_of?(self.class) and
|
190
|
+
hyperbola.focus1 == focus1 and hyperbola.focus2 == focus2 and hyperbola.distance == distance
|
191
191
|
end
|
192
192
|
|
193
193
|
def self.build_by(a2, b2, center, position)
|
194
|
-
|
194
|
+
new(x2: b2, y2: -a2, x: -2 * b2 * center.x, y: 2 * a2 * center.y, k: b2 * center.x ** 2 - a2 * center.y ** 2 + -position * a2 * b2)
|
195
195
|
end
|
196
196
|
|
197
197
|
private_class_method(:build_by)
|
data/lib/cartesius/line.rb
CHANGED
@@ -7,6 +7,10 @@ module Cartesius
|
|
7
7
|
VERTICAL_SLOPE = Float::INFINITY
|
8
8
|
HORIZONTAL_SLOPE = 0
|
9
9
|
|
10
|
+
private_constant(:VERTICAL_SLOPE)
|
11
|
+
private_constant(:HORIZONTAL_SLOPE)
|
12
|
+
|
13
|
+
# equation type: dx + ey + f = 0
|
10
14
|
def initialize(x:, y:, k:)
|
11
15
|
@x_coeff, @y_coeff, @k_coeff = x.to_r, y.to_r, k.to_r
|
12
16
|
validation
|
@@ -17,7 +21,7 @@ module Cartesius
|
|
17
21
|
end
|
18
22
|
|
19
23
|
def self.horizontal(known_term:)
|
20
|
-
|
24
|
+
create(slope: HORIZONTAL_SLOPE, known_term: known_term)
|
21
25
|
end
|
22
26
|
|
23
27
|
def self.vertical(known_term:)
|
@@ -29,18 +33,16 @@ module Cartesius
|
|
29
33
|
raise ArgumentError.new('Points must be different!')
|
30
34
|
end
|
31
35
|
|
32
|
-
if point1.y == point2.y
|
33
|
-
return horizontal(known_term: point1.y)
|
34
|
-
end
|
35
|
-
|
36
36
|
if point1.x == point2.x
|
37
37
|
return vertical(known_term: point1.x)
|
38
|
+
else
|
39
|
+
m, q = Cramer.solution2(
|
40
|
+
[point1.x, 1],
|
41
|
+
[point2.x, 1],
|
42
|
+
[point1.y, point2.y]
|
43
|
+
)
|
44
|
+
create(slope: m, known_term: q)
|
38
45
|
end
|
39
|
-
|
40
|
-
slope = Rational(point2.y - point1.y, point2.x - point1.x)
|
41
|
-
known_term = point1.y - slope * point1.x
|
42
|
-
|
43
|
-
create(slope: slope, known_term: known_term)
|
44
46
|
end
|
45
47
|
|
46
48
|
def self.x_axis
|
@@ -52,19 +54,27 @@ module Cartesius
|
|
52
54
|
end
|
53
55
|
|
54
56
|
def self.ascending_bisector
|
55
|
-
|
57
|
+
create(slope: 1, known_term: 0)
|
56
58
|
end
|
57
59
|
|
58
60
|
def self.descending_bisector
|
59
|
-
|
61
|
+
create(slope: -1, known_term: 0)
|
60
62
|
end
|
61
63
|
|
62
64
|
def slope
|
63
|
-
@y_coeff
|
65
|
+
if @y_coeff.zero?
|
66
|
+
VERTICAL_SLOPE
|
67
|
+
else
|
68
|
+
numberfy(-@x_coeff, @y_coeff)
|
69
|
+
end
|
64
70
|
end
|
65
71
|
|
66
72
|
def known_term
|
67
|
-
@y_coeff
|
73
|
+
if @y_coeff.zero?
|
74
|
+
numberfy(-@k_coeff, @x_coeff)
|
75
|
+
else
|
76
|
+
numberfy(-@k_coeff, @y_coeff)
|
77
|
+
end
|
68
78
|
end
|
69
79
|
|
70
80
|
def x_axis?
|
@@ -92,65 +102,68 @@ module Cartesius
|
|
92
102
|
end
|
93
103
|
|
94
104
|
def inclined?
|
95
|
-
|
105
|
+
ascending? or descending?
|
96
106
|
end
|
97
107
|
|
98
108
|
def ascending?
|
99
|
-
slope != VERTICAL_SLOPE and slope >
|
109
|
+
slope != VERTICAL_SLOPE and slope > HORIZONTAL_SLOPE
|
100
110
|
end
|
101
111
|
|
102
112
|
def descending?
|
103
|
-
slope <
|
113
|
+
slope < HORIZONTAL_SLOPE
|
104
114
|
end
|
105
115
|
|
106
116
|
def parallel?(line)
|
107
|
-
slope ==
|
117
|
+
line.slope == slope
|
108
118
|
end
|
109
119
|
|
110
120
|
def perpendicular?(line)
|
111
|
-
if slope ==
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
121
|
+
if line.slope == HORIZONTAL_SLOPE
|
122
|
+
slope == VERTICAL_SLOPE
|
123
|
+
elsif line.slope == VERTICAL_SLOPE
|
124
|
+
slope == HORIZONTAL_SLOPE
|
125
|
+
else
|
126
|
+
line.slope * slope == -1
|
116
127
|
end
|
117
|
-
slope * line.slope == -1
|
118
128
|
end
|
119
129
|
|
120
130
|
def include?(point)
|
121
131
|
if vertical?
|
122
|
-
|
132
|
+
point.x == known_term
|
133
|
+
else
|
134
|
+
point.y == slope * point.x + known_term
|
123
135
|
end
|
124
|
-
point.y == slope * point.x + known_term
|
125
136
|
end
|
126
137
|
|
127
138
|
def x_intercept
|
128
|
-
@x_coeff.zero?
|
139
|
+
unless @x_coeff.zero?
|
140
|
+
numberfy(-@k_coeff, @x_coeff)
|
141
|
+
end
|
129
142
|
end
|
130
143
|
|
131
144
|
def y_intercept
|
132
|
-
@y_coeff.zero?
|
145
|
+
unless @y_coeff.zero?
|
146
|
+
numberfy(-@k_coeff, @y_coeff)
|
147
|
+
end
|
133
148
|
end
|
134
149
|
|
135
150
|
def to_equation
|
136
|
-
equationfy(
|
137
|
-
'x' => @x_coeff, 'y' => @y_coeff, '1' => @k_coeff
|
138
|
-
)
|
151
|
+
equationfy('x' => @x_coeff, 'y' => @y_coeff, '1' => @k_coeff)
|
139
152
|
end
|
140
153
|
|
141
154
|
def congruent?(line)
|
142
|
-
line.instance_of?(
|
155
|
+
line.instance_of?(self.class)
|
143
156
|
end
|
144
157
|
|
145
158
|
def == (line)
|
146
|
-
line.instance_of?(
|
147
|
-
line.slope ==
|
159
|
+
line.instance_of?(self.class) and
|
160
|
+
line.slope == slope and line.known_term == known_term
|
148
161
|
end
|
149
162
|
|
150
163
|
private
|
151
164
|
|
152
165
|
def validation
|
153
|
-
if
|
166
|
+
if @x_coeff.zero? and @y_coeff.zero?
|
154
167
|
raise ArgumentError.new('Invalid coefficients!')
|
155
168
|
end
|
156
169
|
end
|
data/lib/cartesius/parabola.rb
CHANGED
@@ -28,7 +28,7 @@ module Cartesius
|
|
28
28
|
b = -2 * a * focus.x
|
29
29
|
c = a * (focus.x ** 2) + focus.y - Rational(1, 4 * a)
|
30
30
|
|
31
|
-
|
31
|
+
new(x2: a, x: b, k: c)
|
32
32
|
end
|
33
33
|
|
34
34
|
def self.by_points(point1:, point2:, point3:)
|
@@ -39,7 +39,7 @@ module Cartesius
|
|
39
39
|
[point1.y, point2.y, point3.y]
|
40
40
|
)
|
41
41
|
|
42
|
-
|
42
|
+
new(x2: a, x: b, k: c)
|
43
43
|
rescue
|
44
44
|
raise ArgumentError.new('Invalid points!')
|
45
45
|
end
|
@@ -71,13 +71,13 @@ module Cartesius
|
|
71
71
|
end
|
72
72
|
|
73
73
|
def congruent?(parabola)
|
74
|
-
parabola.instance_of?(
|
75
|
-
parabola.eccentricity ==
|
74
|
+
parabola.instance_of?(self.class) and
|
75
|
+
parabola.eccentricity == eccentricity
|
76
76
|
end
|
77
77
|
|
78
78
|
def == (parabola)
|
79
|
-
parabola.instance_of?(
|
80
|
-
parabola.focus ==
|
79
|
+
parabola.instance_of?(self.class) and
|
80
|
+
parabola.focus == focus and parabola.directrix == directrix
|
81
81
|
end
|
82
82
|
|
83
83
|
private
|
data/lib/cartesius/point.rb
CHANGED
@@ -1,7 +1,6 @@
|
|
1
1
|
require('cartesius/numerificator')
|
2
2
|
|
3
3
|
module Cartesius
|
4
|
-
|
5
4
|
class Point
|
6
5
|
include Numerificator
|
7
6
|
attr_reader :x, :y
|
@@ -15,36 +14,36 @@ module Cartesius
|
|
15
14
|
end
|
16
15
|
|
17
16
|
def self.distance(point1, point2)
|
18
|
-
Math.sqrt((point1.x - point2.x)** 2 + (point1.y - point2.y)** 2)
|
17
|
+
Math.sqrt((point1.x - point2.x) ** 2 + (point1.y - point2.y) ** 2)
|
19
18
|
end
|
20
19
|
|
21
20
|
def origin?
|
22
21
|
self == Point.origin
|
23
22
|
end
|
24
23
|
|
25
|
-
def distance_from(point)
|
26
|
-
Math.sqrt((@x - point.x)** 2 + (@y - point.y)** 2)
|
27
|
-
end
|
28
|
-
|
29
24
|
def to_coordinates
|
30
25
|
"(#{stringfy(x)}; #{stringfy(y)})"
|
31
26
|
end
|
32
27
|
|
33
28
|
def to_equation
|
34
|
-
equationfy(
|
35
|
-
'x^2' => 1, 'y^2' => 1, 'x' => -2 * @x, 'y' => -2 * @y, '1' => @x ** 2 + @y ** 2
|
36
|
-
)
|
29
|
+
equationfy('x^2' => 1, 'y^2' => 1, 'x' => -2 * @x, 'y' => -2 * @y, '1' => @x ** 2 + @y ** 2)
|
37
30
|
end
|
38
31
|
|
39
32
|
def congruent?(point)
|
40
|
-
point.instance_of?(
|
33
|
+
point.instance_of?(self.class)
|
41
34
|
end
|
42
35
|
|
43
36
|
def == (point)
|
44
|
-
point.instance_of?(
|
37
|
+
point.instance_of?(self.class) and
|
45
38
|
point.x == @x and point.y == @y
|
46
39
|
end
|
47
40
|
|
48
|
-
|
41
|
+
alias_method(:eql?, :==)
|
49
42
|
|
43
|
+
private
|
44
|
+
|
45
|
+
def hash
|
46
|
+
@x.hash ^ @y.hash
|
47
|
+
end
|
48
|
+
end
|
50
49
|
end
|
data/lib/cartesius/segment.rb
CHANGED
@@ -4,6 +4,7 @@ require('cartesius/line')
|
|
4
4
|
module Cartesius
|
5
5
|
|
6
6
|
class Segment
|
7
|
+
include Numerificator
|
7
8
|
extend Forwardable
|
8
9
|
attr_reader :extreme1, :extreme2
|
9
10
|
def_delegators(:@line, :horizontal?, :vertical?, :inclined?, :ascending?, :descending?)
|
@@ -24,8 +25,8 @@ module Cartesius
|
|
24
25
|
|
25
26
|
def mid
|
26
27
|
Point.new(
|
27
|
-
x:
|
28
|
-
y:
|
28
|
+
x: numberfy(@extreme1.x + @extreme2.x, 2),
|
29
|
+
y: numberfy(@extreme1.y + @extreme2.y, 2)
|
29
30
|
)
|
30
31
|
end
|
31
32
|
|
@@ -34,17 +35,15 @@ module Cartesius
|
|
34
35
|
end
|
35
36
|
|
36
37
|
def congruent?(segment)
|
37
|
-
segment.instance_of?(
|
38
|
+
segment.instance_of?(self.class) and
|
38
39
|
segment.length == self.length
|
39
40
|
end
|
40
41
|
|
41
42
|
def == (segment)
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
(segment.extreme1 == self.extreme1 and segment.extreme2 == self.extreme2) or
|
47
|
-
(segment.extreme1 == self.extreme2 and segment.extreme2 == self.extreme1)
|
43
|
+
segment.instance_of?(self.class) and (
|
44
|
+
(segment.extreme1 == extreme1 and segment.extreme2 == extreme2) or
|
45
|
+
(segment.extreme1 == extreme2 and segment.extreme2 == extreme1)
|
46
|
+
)
|
48
47
|
end
|
49
48
|
|
50
49
|
private
|
@@ -0,0 +1,106 @@
|
|
1
|
+
require('cartesius/validator')
|
2
|
+
require('cartesius/segment')
|
3
|
+
require('cartesius/angle')
|
4
|
+
|
5
|
+
module Cartesius
|
6
|
+
|
7
|
+
class Triangle
|
8
|
+
|
9
|
+
def initialize(a:, b:, c:)
|
10
|
+
validation(a, b, c)
|
11
|
+
@v_a = a
|
12
|
+
@v_b = b
|
13
|
+
@v_c = c
|
14
|
+
@s_a = Segment.new(extreme1: @v_b, extreme2: @v_c)
|
15
|
+
@s_b = Segment.new(extreme1: @v_a, extreme2: @v_c)
|
16
|
+
@s_c = Segment.new(extreme1: @v_a, extreme2: @v_b)
|
17
|
+
@a_a = Angle.by_radiants(carnot(@s_a, @s_b, @s_c))
|
18
|
+
@a_b = Angle.by_radiants(carnot(@s_b, @s_a, @s_c))
|
19
|
+
@a_c = Angle.by_radiants(carnot(@s_c, @s_a, @s_b))
|
20
|
+
end
|
21
|
+
|
22
|
+
def angles
|
23
|
+
{a: @a_a, b: @a_b, c: @a_c}
|
24
|
+
end
|
25
|
+
|
26
|
+
def sides
|
27
|
+
{a: @s_a, b: @s_b, c: @s_c}
|
28
|
+
end
|
29
|
+
|
30
|
+
def vertices
|
31
|
+
{a: @v_a, b: @v_b, c: @v_c}
|
32
|
+
end
|
33
|
+
|
34
|
+
def rectangle?
|
35
|
+
angles.values.any?(&:right?)
|
36
|
+
end
|
37
|
+
|
38
|
+
def obtuse?
|
39
|
+
angles.values.any?(&:obtuse?)
|
40
|
+
end
|
41
|
+
|
42
|
+
def acute?
|
43
|
+
not rectangle? and not obtuse?
|
44
|
+
end
|
45
|
+
|
46
|
+
def equilateral?(precision = 2)
|
47
|
+
sides_congruent(precision) == 1
|
48
|
+
end
|
49
|
+
|
50
|
+
def isosceles?(precision = 2)
|
51
|
+
equilateral? or sides_congruent(precision) == 2
|
52
|
+
end
|
53
|
+
|
54
|
+
def scalene?(precision = 2)
|
55
|
+
sides_congruent(precision) == 3
|
56
|
+
end
|
57
|
+
|
58
|
+
def perimeter
|
59
|
+
sides.values.inject(0) {|sum, side| sum + side.length}
|
60
|
+
end
|
61
|
+
|
62
|
+
def area(precision = 2)
|
63
|
+
Rational(sides[:a].length * sides[:b].length * Math.sin(angles[:c].radiants), 2).round(precision)
|
64
|
+
end
|
65
|
+
|
66
|
+
def == (triangle)
|
67
|
+
triangle.instance_of?(self.class) and
|
68
|
+
triangle.vertices.values.to_set == vertices.values.to_set
|
69
|
+
end
|
70
|
+
|
71
|
+
def congruent? (triangle)
|
72
|
+
triangle.instance_of?(self.class) and
|
73
|
+
sides_length(triangle) == sides_length(self)
|
74
|
+
end
|
75
|
+
|
76
|
+
def similar?(triangle)
|
77
|
+
triangle.instance_of?(self.class) and
|
78
|
+
triangle.angles.values.to_set == angles.values.to_set
|
79
|
+
end
|
80
|
+
|
81
|
+
private
|
82
|
+
|
83
|
+
def carnot(side1, side2, side3)
|
84
|
+
cosine = Rational(
|
85
|
+
side2.length ** 2 + side3.length ** 2 - side1.length ** 2,
|
86
|
+
2 * side2.length * side3.length
|
87
|
+
)
|
88
|
+
Math.acos(cosine)
|
89
|
+
end
|
90
|
+
|
91
|
+
def validation(a, b, c)
|
92
|
+
Validator.same_points([a, b, c])
|
93
|
+
Validator.aligned_points([a, b, c])
|
94
|
+
end
|
95
|
+
|
96
|
+
def sides_length(triangle)
|
97
|
+
triangle.sides.values.collect(&:length).sort
|
98
|
+
end
|
99
|
+
|
100
|
+
def sides_congruent(precision)
|
101
|
+
sides_length(self).map {|side| side.round(precision)}.uniq.count
|
102
|
+
end
|
103
|
+
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cartesius
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Mauro Quaglia
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2018-01-05 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: The cartesian plan and its elements.
|
14
14
|
email: mauroquaglia@libero.it
|
@@ -16,6 +16,7 @@ executables: []
|
|
16
16
|
extensions: []
|
17
17
|
extra_rdoc_files: []
|
18
18
|
files:
|
19
|
+
- lib/cartesius/angle.rb
|
19
20
|
- lib/cartesius/circumference.rb
|
20
21
|
- lib/cartesius/ellipse.rb
|
21
22
|
- lib/cartesius/hyperbola.rb
|
@@ -23,6 +24,7 @@ files:
|
|
23
24
|
- lib/cartesius/parabola.rb
|
24
25
|
- lib/cartesius/point.rb
|
25
26
|
- lib/cartesius/segment.rb
|
27
|
+
- lib/cartesius/triangle.rb
|
26
28
|
homepage: https://github.com/MauroQuaglia/cartesius
|
27
29
|
licenses:
|
28
30
|
- MIT
|
@@ -35,7 +37,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
35
37
|
requirements:
|
36
38
|
- - ">="
|
37
39
|
- !ruby/object:Gem::Version
|
38
|
-
version: 2.
|
40
|
+
version: 2.1.0
|
39
41
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
40
42
|
requirements:
|
41
43
|
- - ">="
|
@@ -43,7 +45,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
43
45
|
version: '0'
|
44
46
|
requirements: []
|
45
47
|
rubyforge_project:
|
46
|
-
rubygems_version: 2.6.
|
48
|
+
rubygems_version: 2.6.14
|
47
49
|
signing_key:
|
48
50
|
specification_version: 4
|
49
51
|
summary: The cartesian coordinate system.
|