Class: RubyChartEngine::Calculations::Houses

Inherits:
Object
  • Object
show all
Defined in:
lib/ruby_chart_engine/calculations/houses.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(julian_day:, latitude:, longitude:, house_system: :placidus) ⇒ Houses

Returns a new instance of Houses.



6
7
8
9
10
11
# File 'lib/ruby_chart_engine/calculations/houses.rb', line 6

def initialize(julian_day:, latitude:, longitude:, house_system: :placidus)
  @julian_day = julian_day
  @latitude = latitude
  @longitude = longitude
  @house_system = house_system
end

Instance Attribute Details

#house_systemObject (readonly)

Returns the value of attribute house_system.



4
5
6
# File 'lib/ruby_chart_engine/calculations/houses.rb', line 4

def house_system
  @house_system
end

#julian_dayObject (readonly)

Returns the value of attribute julian_day.



4
5
6
# File 'lib/ruby_chart_engine/calculations/houses.rb', line 4

def julian_day
  @julian_day
end

#latitudeObject (readonly)

Returns the value of attribute latitude.



4
5
6
# File 'lib/ruby_chart_engine/calculations/houses.rb', line 4

def latitude
  @latitude
end

#longitudeObject (readonly)

Returns the value of attribute longitude.



4
5
6
# File 'lib/ruby_chart_engine/calculations/houses.rb', line 4

def longitude
  @longitude
end

Instance Method Details

#calculateObject

Calculate house cusps and angles



14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/ruby_chart_engine/calculations/houses.rb', line 14

def calculate
  system_code = HOUSE_SYSTEMS[house_system] || 'P'

  # Call swe_houses - returns a flat array of 23 elements
  # [0-12]: house cusps (0 is unused, 1-12 are the 12 houses)
  # [13+]: ASCMC values (ascendant, MC, ARMC, vertex, etc.)
  result = Swe4r.swe_houses(julian_day, latitude, longitude, system_code)

  unless result.is_a?(Array)
    raise Error, "Unexpected swe_houses return type: #{result.class} - #{result.inspect}"
  end

  {
    cusps: extract_cusps(result),
    angles: extract_angles(result)
  }
rescue StandardError => e
  raise Error, "Failed to calculate houses: #{e.message}\nResult type: #{result.class rescue 'unknown'}\nResult: #{result.inspect rescue 'uninspectable'}"
end

#house_for_longitude(longitude, cusps) ⇒ Object

Determine which house a longitude is in



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/ruby_chart_engine/calculations/houses.rb', line 35

def house_for_longitude(longitude, cusps)
  # Normalize longitude
  longitude = normalize_degrees(longitude)

  # Return default if cusps is empty or invalid
  return 1 if cusps.nil? || cusps.empty? || cusps.length < 12

  # Find the house
  12.times do |i|
    cusp_start = cusps[i]
    cusp_end = cusps[(i + 1) % 12]

    # Skip if cusps are nil
    next if cusp_start.nil? || cusp_end.nil?

    # Handle wrapping around 0 degrees
    if cusp_start > cusp_end
      return i + 1 if longitude >= cusp_start || longitude < cusp_end
    else
      return i + 1 if longitude >= cusp_start && longitude < cusp_end
    end
  end

  1 # Default to first house
end