class Cartesius::Angle

Constants

FULL

Public Class Methods

by_degrees(degrees) click to toggle source
# File lib/cartesius/angle.rb, line 19
def self.by_degrees(degrees)
  new(degrees)
end
by_lines(line1:, line2:) click to toggle source
# File lib/cartesius/angle.rb, line 27
def self.by_lines(line1:, line2:)
  raise ArgumentError.new('Lines must not be parallel!') if line1.parallel?(line2)
  if line1.perpendicular?(line2)
    [right, right]
  else
    acute = by_radiants(Math.atan(line1.slope - line2.slope / 1 + line1.slope * line2.slope).abs)
    [acute, new(FLAT - acute.degrees)]
  end
end
by_radiants(radiants) click to toggle source
# File lib/cartesius/angle.rb, line 23
def self.by_radiants(radiants)
  by_degrees(radiants * FLAT / Math::PI)
end
flat() click to toggle source
# File lib/cartesius/angle.rb, line 45
def self.flat
  by_degrees(FLAT)
end
full() click to toggle source
# File lib/cartesius/angle.rb, line 49
def self.full
  by_degrees(FULL)
end
null() click to toggle source
# File lib/cartesius/angle.rb, line 37
def self.null
  by_degrees(NULL)
end
right() click to toggle source
# File lib/cartesius/angle.rb, line 41
def self.right
  by_degrees(RIGHT)
end

Private Class Methods

new(angle) click to toggle source
# File lib/cartesius/angle.rb, line 12
def initialize(angle)
  validation(angle)
  @angle = angle
end

Public Instance Methods

acute?() click to toggle source
# File lib/cartesius/angle.rb, line 65
def acute?
  CloseNeighbourhood.new(45, 45 - Tolerance::TOLERANCE).include?(degrees)
end
congruent?(other) click to toggle source
# File lib/cartesius/angle.rb, line 85
def congruent?(other)
  other.instance_of?(self.class) &&
      OpenNeighbourhood.new(NULL, Tolerance::TOLERANCE).include?((other.degrees - degrees).abs)
end
Also aliased as: eql?
degrees() click to toggle source
# File lib/cartesius/angle.rb, line 53
def degrees
  @angle
end
eql?(other)
Alias for: congruent?
flat?() click to toggle source
# File lib/cartesius/angle.rb, line 77
def flat?
  OpenNeighbourhood.new(FLAT, Tolerance::TOLERANCE).include?(degrees)
end
full?() click to toggle source
# File lib/cartesius/angle.rb, line 81
def full?
  OpenNeighbourhood.new(FULL, Tolerance::TOLERANCE).include?(degrees)
end
null?() click to toggle source
# File lib/cartesius/angle.rb, line 61
def null?
  OpenNeighbourhood.new(NULL, Tolerance::TOLERANCE).include?(degrees)
end
obtuse?() click to toggle source
# File lib/cartesius/angle.rb, line 73
def obtuse?
  CloseNeighbourhood.new(135, 45 - Tolerance::TOLERANCE).include?(degrees)
end
radiants(precision = 3) click to toggle source
# File lib/cartesius/angle.rb, line 57
def radiants(precision = 3)
  (@angle * Math::PI / FLAT).round(precision)
end
right?() click to toggle source
# File lib/cartesius/angle.rb, line 69
def right?
  OpenNeighbourhood.new(RIGHT, Tolerance::TOLERANCE).include?(degrees)
end

Private Instance Methods

hash() click to toggle source
# File lib/cartesius/angle.rb, line 100
def hash
  @angle.hash
end
validation(angle) click to toggle source
# File lib/cartesius/angle.rb, line 94
def validation(angle)
  if angle < NULL || angle > FULL
    raise ArgumentError.new('Invalid angle!')
  end
end