Class: Cartesius::Triangle

Inherits:
Object
  • Object
show all
Defined in:
lib/cartesius/triangle.rb

Instance Method Summary collapse

Constructor Details

#initialize(a:, b:, c:) ⇒ Triangle



9
10
11
12
13
14
15
16
17
18
19
20
# File 'lib/cartesius/triangle.rb', line 9

def initialize(a:, b:, c:)
  validation(a, b, c)
  @v_a = a
  @v_b = b
  @v_c = c
  @s_a = Segment.new(extreme1: @v_b, extreme2: @v_c)
  @s_b = Segment.new(extreme1: @v_a, extreme2: @v_c)
  @s_c = Segment.new(extreme1: @v_a, extreme2: @v_b)
  @a_a = Angle.by_radiants(carnot(@s_a, @s_b, @s_c))
  @a_b = Angle.by_radiants(carnot(@s_b, @s_a, @s_c))
  @a_c = Angle.by_radiants(carnot(@s_c, @s_a, @s_b))
end

Instance Method Details

#==(triangle) ⇒ Object



66
67
68
69
# File 'lib/cartesius/triangle.rb', line 66

def == (triangle)
  triangle.instance_of?(self.class) and
      triangle.vertices.values.to_set == vertices.values.to_set
end

#acute?Boolean



42
43
44
# File 'lib/cartesius/triangle.rb', line 42

def acute?
  not rectangle? and not obtuse?
end

#anglesObject



22
23
24
# File 'lib/cartesius/triangle.rb', line 22

def angles
  {a: @a_a, b: @a_b, c: @a_c}
end

#area(precision = 2) ⇒ Object



62
63
64
# File 'lib/cartesius/triangle.rb', line 62

def area(precision = 2)
  Rational(sides[:a].length * sides[:b].length * Math.sin(angles[:c].radiants), 2).round(precision)
end

#congruent?(triangle) ⇒ Boolean



71
72
73
74
# File 'lib/cartesius/triangle.rb', line 71

def congruent? (triangle)
  triangle.instance_of?(self.class) and
      sides_length(triangle) == sides_length(self)
end

#equilateral?(precision = 2) ⇒ Boolean



46
47
48
# File 'lib/cartesius/triangle.rb', line 46

def equilateral?(precision = 2)
  sides_congruent(precision) == 1
end

#isosceles?(precision = 2) ⇒ Boolean



50
51
52
# File 'lib/cartesius/triangle.rb', line 50

def isosceles?(precision = 2)
  equilateral? or sides_congruent(precision) == 2
end

#obtuse?Boolean



38
39
40
# File 'lib/cartesius/triangle.rb', line 38

def obtuse?
  angles.values.any?(&:obtuse?)
end

#perimeterObject



58
59
60
# File 'lib/cartesius/triangle.rb', line 58

def perimeter
  sides.values.inject(0) {|sum, side| sum + side.length}
end

#rectangle?Boolean



34
35
36
# File 'lib/cartesius/triangle.rb', line 34

def rectangle?
  angles.values.any?(&:right?)
end

#scalene?(precision = 2) ⇒ Boolean



54
55
56
# File 'lib/cartesius/triangle.rb', line 54

def scalene?(precision = 2)
  sides_congruent(precision) == 3
end

#sidesObject



26
27
28
# File 'lib/cartesius/triangle.rb', line 26

def sides
  {a: @s_a, b: @s_b, c: @s_c}
end

#similar?(triangle) ⇒ Boolean



76
77
78
79
# File 'lib/cartesius/triangle.rb', line 76

def similar?(triangle)
  triangle.instance_of?(self.class) and
      triangle.angles.values.to_set == angles.values.to_set
end

#verticesObject



30
31
32
# File 'lib/cartesius/triangle.rb', line 30

def vertices
  {a: @v_a, b: @v_b, c: @v_c}
end