class GSS::Generator

Public Instance Methods

generate(n, relocation = false) click to toggle source
# File lib/gss/generator.rb, line 13
def generate(n, relocation = false)
  theta_1 = Math::PI
  phi_1 = 0.0

  points = []
  points << PolarPoint.new(theta_1, phi_1)
  2.upto(n) do |k|
    h_k = -1.0 + 2.0 * (k - 1) / (n - 1)
    theta_k = Math.acos(h_k)
    phi_k = points.last.phi + 3.6 / Math.sqrt(n) * 1 / Math.sqrt(1 - h_k ** 2)
    phi_k = phi_k.infinite? ? 0.0 : phi_k % (Math::PI * 2.0)
    points << PolarPoint.new(theta_k, phi_k) 
  end

  if relocation
    points[0] = relocate(points[1], points[2], points[4], points[5], points[6])
    points[-1] = relocate(points[-2], points[-3], points[-5], points[-6], points[-7])
  end

  points
end

Private Instance Methods

relocate(p1, p2, p3, p4, p5) click to toggle source
# File lib/gss/generator.rb, line 37
def relocate(p1, p2, p3, p4, p5)
  c = [p1, p2, p3, p4, p5].map{|p| p.to_cartesian }
  c = c.transpose.map{|l| l.inject(&:+) / 5.0 }
  PolarPoint.from_cartesian(c[0], c[1], c[2])
end