class Cartesius::Triangle

Public Class Methods

new(a:, b:, c:) click to toggle source
# 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

Public Instance Methods

==(triangle) click to toggle source
# File lib/cartesius/triangle.rb, line 66
def == (triangle)
  triangle.instance_of?(self.class) &&
      triangle.vertices.values.to_set == vertices.values.to_set
end
acute?() click to toggle source
# File lib/cartesius/triangle.rb, line 42
def acute?
  !rectangle? && !obtuse?
end
angles() click to toggle source
# File lib/cartesius/triangle.rb, line 22
def angles
  {a: @a_a, b: @a_b, c: @a_c}
end
area(precision = 2) click to toggle source
# 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) click to toggle source
# File lib/cartesius/triangle.rb, line 71
def congruent? (triangle)
  triangle.instance_of?(self.class) &&
      sides_length(triangle) == sides_length(self)
end
equilateral?() click to toggle source
# File lib/cartesius/triangle.rb, line 46
def equilateral?
  sides_congruent == 1
end
isosceles?() click to toggle source
# File lib/cartesius/triangle.rb, line 50
def isosceles?
  equilateral? || sides_congruent == 2
end
obtuse?() click to toggle source
# File lib/cartesius/triangle.rb, line 38
def obtuse?
  angles.values.any?(&:obtuse?)
end
perimeter() click to toggle source
# File lib/cartesius/triangle.rb, line 58
def perimeter
  sides.values.inject(0) {|sum, side| sum + side.length}
end
rectangle?() click to toggle source
# File lib/cartesius/triangle.rb, line 34
def rectangle?
  angles.values.any?(&:right?)
end
scalene?() click to toggle source
# File lib/cartesius/triangle.rb, line 54
def scalene?
  sides_congruent == 3
end
sides() click to toggle source
# File lib/cartesius/triangle.rb, line 26
def sides
  {a: @s_a, b: @s_b, c: @s_c}
end
similar?(triangle) click to toggle source
# File lib/cartesius/triangle.rb, line 76
def similar?(triangle)
  triangle.instance_of?(self.class) &&
      triangle.angles.values.to_set == angles.values.to_set
end
vertices() click to toggle source
# File lib/cartesius/triangle.rb, line 30
def vertices
  {a: @v_a, b: @v_b, c: @v_c}
end

Private Instance Methods

carnot(side1, side2, side3) click to toggle source
# File lib/cartesius/triangle.rb, line 83
def carnot(side1, side2, side3)
  cosine = Rational(
      side2.length ** 2 + side3.length ** 2 - side1.length ** 2,
      2 * side2.length * side3.length
  )
  Math.acos(cosine)
end
sides_congruent() click to toggle source
# File lib/cartesius/triangle.rb, line 100
def sides_congruent
  sides_length(self).map {|s| s.round(3)}.to_set.count
end
sides_length(triangle) click to toggle source
# File lib/cartesius/triangle.rb, line 96
def sides_length(triangle)
  triangle.sides.values.collect(&:length)
end
validation(a, b, c) click to toggle source
# File lib/cartesius/triangle.rb, line 91
def validation(a, b, c)
  Validator.same_points([a, b, c])
  Validator.aligned_points([a, b, c])
end