class Cartesius::Parabola

Public Class Methods

by_definition(directrix:, focus:) click to toggle source
# File lib/cartesius/parabola.rb, line 18
def self.by_definition(directrix:, focus:)
  if directrix.include?(focus)
    raise ArgumentError.new('Focus belongs to directrix!')
  end

  unless directrix.horizontal?
    raise ArgumentError.new('Directrix is not parallel to x-axis!')
  end

  a = Rational(1, 2 * (focus.y - directrix.y_intercept))
  b = -2 * a * focus.x
  c = a * (focus.x ** 2) + focus.y - Rational(1, 4 * a)

  new(x2: a, x: b, k: c)
end
by_points(point1:, point2:, point3:) click to toggle source
# File lib/cartesius/parabola.rb, line 34
def self.by_points(point1:, point2:, point3:)
  a, b, c = Cramer.solution3(
      [point1.x ** 2, point1.x, 1],
      [point2.x ** 2, point2.x, 1],
      [point3.x ** 2, point3.x, 1],
      [point1.y, point2.y, point3.y]
  )

  new(x2: a, x: b, k: c)
rescue
  raise ArgumentError.new('Invalid points!')
end
new(x2:, x:, k:) click to toggle source

Conic Conic equation type: ax^2 + dx - y + f = 0

# File lib/cartesius/parabola.rb, line 13
def initialize(x2:, x:, k:)
  @x2_coeff, @x_coeff, @y_coeff, @k_coeff = x2.to_r, x.to_r, -1, k.to_r
  validation
end

Public Instance Methods

==(parabola) click to toggle source
# File lib/cartesius/parabola.rb, line 78
def == (parabola)
  parabola.instance_of?(self.class) &&
      parabola.focus == focus && parabola.directrix == directrix
end
congruent?(parabola) click to toggle source
# File lib/cartesius/parabola.rb, line 73
def congruent?(parabola)
  parabola.instance_of?(self.class) &&
      parabola.eccentricity == eccentricity
end
directrix() click to toggle source
# File lib/cartesius/parabola.rb, line 47
def directrix
  Line.horizontal(known_term: Rational(-delta - 1, 4 * @x2_coeff))
end
eccentricity() click to toggle source
# File lib/cartesius/parabola.rb, line 63
def eccentricity
  @x2_coeff.abs
end
focus() click to toggle source
# File lib/cartesius/parabola.rb, line 51
def focus
  Point.new(x: Rational(-@x_coeff, 2 * @x2_coeff), y: Rational(1 - delta, 4 * @x2_coeff))
end
symmetry_axis() click to toggle source
# File lib/cartesius/parabola.rb, line 59
def symmetry_axis
  Line.vertical(known_term: Rational(-@x_coeff, 2* @x2_coeff))
end
to_equation() click to toggle source
# File lib/cartesius/parabola.rb, line 67
def to_equation
  equationfy(
      'x^2' => @x2_coeff, 'x' => @x_coeff, 'y' => -1, '1' => @k_coeff
  )
end
vertex() click to toggle source
# File lib/cartesius/parabola.rb, line 55
def vertex
  Point.new(x: Rational(-@x_coeff, 2 * @x2_coeff), y: Rational(-delta, 4 * @x2_coeff))
end

Private Instance Methods

delta() click to toggle source
# File lib/cartesius/parabola.rb, line 91
def delta
  (@x_coeff ** 2) - (4 * @x2_coeff * @k_coeff)
end
validation() click to toggle source
# File lib/cartesius/parabola.rb, line 85
def validation
  if @x2_coeff == 0
    raise ArgumentError.new('Invalid coefficients!')
  end
end