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