class Distance

Constants

CITY_LIST
RADIUS_OF_EARTH

Public Class Methods

new(from, to, travel_method) click to toggle source
# File lib/turkish_cities/distance.rb, line 15
def initialize(from, to, travel_method)
  @from = from
  @to = to
  @travel_method = travel_method
end

Public Instance Methods

distance_between() click to toggle source
# File lib/turkish_cities/distance.rb, line 21
def distance_between
  case @travel_method
  when 'land'
    distance_between_land
  when 'sea'
    distance_between_sea
  when 'air'
    distance_between_air
  else
    unsupported_travel_method(@travel_method)
  end
end

Private Instance Methods

calculate_flight_distance(city_array) click to toggle source

rubocop:disable Metrics/AbcSize

# File lib/turkish_cities/distance.rb, line 96
def calculate_flight_distance(city_array)
  lat_diff = degree_to_radian(city_array[1]['latitude'] - city_array[0]['latitude'])
  lng_diff = degree_to_radian(city_array[1]['longitude'] - city_array[0]['longitude'])

  from_lat = degree_to_radian(city_array[0]['latitude'])
  to_lat = degree_to_radian(city_array[1]['latitude'])

  cosines_var = (Math.sin(lat_diff / 2)**2) + ((Math.sin(lng_diff / 2)**2) * (Math.cos(from_lat) * Math.cos(to_lat)))
  result = 2 * Math.atan2(Math.sqrt(cosines_var), Math.sqrt(1 - cosines_var))
  RADIUS_OF_EARTH * result
end
calculate_land_distance(city_array) click to toggle source

rubocop:disable Metrics/AbcSize

# File lib/turkish_cities/distance.rb, line 79
def calculate_land_distance(city_array)
  # Distance information between cities are kept in yaml files in a plate number order
  # For example if distance between plate number 10 with plate number 3
  # Order should be 3 to 10 not 10 to 3
  if city_array[0]['plate_number'] > city_array[1]['plate_number']
    return city_array[1]['land_distance'][city_array[0]['plate_number'] - city_array[1]['plate_number'] - 1]
  end

  city_array[0]['land_distance'][city_array[1]['plate_number'] - city_array[0]['plate_number'] - 1]
end
degree_to_radian(degree) click to toggle source

rubocop:enable Metrics/AbcSize

# File lib/turkish_cities/distance.rb, line 91
def degree_to_radian(degree)
  degree * Math::PI / 180
end
description_text(travel_method, city_array, result_set) click to toggle source
# File lib/turkish_cities/distance.rb, line 122
def description_text(travel_method, city_array, result_set)
  if travel_method == 'Air'
    return I18n.t('description_text.air_travel', first_city: city_array[0]['name'],
                                                 second_city: city_array[1]['name'],
                                                 distance: result_set[0],
                                                 duration: result_set[1])
  end

  I18n.t('description_text.land_travel', first_city: city_array[0]['name'],
                                         second_city: city_array[1]['name'],
                                         distance: result_set[0])
end
distance_between_air() click to toggle source
# File lib/turkish_cities/distance.rb, line 53
def distance_between_air
  city_array = find_city_attributes
  case city_array
  when String
    city_array
  when Array
    results = []
    results[0] = calculate_flight_distance(city_array).round(2)
    results[1] = distance_time_estimation(results[0]).to_i
    results[2] = description_text('Air', city_array, results)
    results
  end
end
distance_between_land() click to toggle source
# File lib/turkish_cities/distance.rb, line 36
def distance_between_land
  city_array = find_city_attributes
  case city_array
  when String
    city_array
  when Array
    results = []
    results[0] = calculate_land_distance(city_array)
    results[1] = description_text('Land', city_array, results)
    results
  end
end
distance_between_sea() click to toggle source
# File lib/turkish_cities/distance.rb, line 49
def distance_between_sea
  # TODO
end
distance_time_estimation(air_distance) click to toggle source

Time estimation for air travel. For planes take-off and landing took nearly same amount. Longer the distance shorter the time. Flying out at high altitude makes less air resistance / more speed

# File lib/turkish_cities/distance.rb, line 111
def distance_time_estimation(air_distance)
  case air_distance
  when 0..400
    (air_distance / 10) + 30
  when 400..1000
    (air_distance / 11.25) + 30
  else
    (air_distance / 12.5) + 25
  end
end
find_city_attributes() click to toggle source
# File lib/turkish_cities/distance.rb, line 67
def find_city_attributes
  from_city = to_city = nil

  CITY_LIST.each do |city|
    from_city = city if convert_chars(@from) == convert_chars(city['name'])
    to_city = city if convert_chars(@to) == convert_chars(city['name'])
  end

  from_city.nil? || to_city.nil? ? cities_not_found_error(@from, @to) : [from_city, to_city]
end