Class: M26::Speed

Inherits:
Object
  • Object
show all
Includes:
Constants
Defined in:
lib/m26_speed.rb

Constant Summary

Constants included from Constants

Constants::AUTHOR, Constants::DATE, Constants::EMAIL, Constants::KILOMETERS_PER_MILE, Constants::MILES_PER_KILOMETER, Constants::SECONDS_PER_HOUR, Constants::UOM_KILOMETERS, Constants::UOM_MILES, Constants::UOM_YARDS, Constants::VERSION, Constants::YARDS_PER_KILOMETER, Constants::YARDS_PER_MILE

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(dist, et) ⇒ Speed

Returns a new instance of Speed.



16
17
18
19
20
# File 'lib/m26_speed.rb', line 16

def initialize(dist, et)
  @distance     = dist
  @elapsed_time = et
  @mph          = 0
end

Instance Attribute Details

#ag_factorObject

Returns the value of attribute ag_factor.



14
15
16
# File 'lib/m26_speed.rb', line 14

def ag_factor
  @ag_factor
end

#ag_secsObject

Returns the value of attribute ag_secs.



14
15
16
# File 'lib/m26_speed.rb', line 14

def ag_secs
  @ag_secs
end

#ag_speedObject

Returns the value of attribute ag_speed.



14
15
16
# File 'lib/m26_speed.rb', line 14

def ag_speed
  @ag_speed
end

#ag_timeObject

Returns the value of attribute ag_time.



14
15
16
# File 'lib/m26_speed.rb', line 14

def ag_time
  @ag_time
end

#base_ageObject

Returns the value of attribute base_age.



14
15
16
# File 'lib/m26_speed.rb', line 14

def base_age
  @base_age
end

#distanceObject

Returns the value of attribute distance.



13
14
15
# File 'lib/m26_speed.rb', line 13

def distance
  @distance
end

#elapsed_timeObject

Returns the value of attribute elapsed_time.



13
14
15
# File 'lib/m26_speed.rb', line 13

def elapsed_time
  @elapsed_time
end

#evt_ageObject

Returns the value of attribute evt_age.



14
15
16
# File 'lib/m26_speed.rb', line 14

def evt_age
  @evt_age
end

Class Method Details

.calculate_average_speed(s1, s2, t1, t2) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
# File 'lib/m26_speed.rb', line 30

def self.calculate_average_speed(s1, s2, t1, t2)
  speed1, speed2, etime1, etime2 = s1, s2, t1, t2
  total_time = (etime1.secs + etime2.secs).to_f
  speed1_pct = ((etime1.secs).to_f) / total_time.to_f
  speed2_pct = ((etime2.secs).to_f) / total_time.to_f
  spm1  = ((speed1.seconds_per_mile).to_f) * speed1_pct
  spm2  = ((speed2.seconds_per_mile).to_f) * speed2_pct
  spm   = spm1 + spm2
  tpm   = M26::ElapsedTime.new(spm)
  M26::Speed.new(Distance.new(1.0), tpm)
end

.from_pace_per_mile(ppm) ⇒ Object



22
23
24
25
26
27
28
# File 'lib/m26_speed.rb', line 22

def self.from_pace_per_mile(ppm)
  dist   = M26::Distance.new(1.0)
  tokens = ppm.split(':')
  secs   = ((tokens[0].to_i * 60) + tokens[1].to_i).to_f
  et     = M26::ElapsedTime.new(secs)
  M26::Speed.new(dist, et)
end

Instance Method Details

#age_graded(dob, event_yyyy_mm_dd, base_yyyy_mm_dd) ⇒ Object



107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/m26_speed.rb', line 107

def age_graded(dob, event_yyyy_mm_dd, base_yyyy_mm_dd)
  @evt_age   = M26::Age.new(dob, event_yyyy_mm_dd)
  @base_age  = M26::Age.new(dob, base_yyyy_mm_dd)
  @ag_factor = (base_age.max_pulse / evt_age.max_pulse).to_f
  @ag_secs   = (elapsed_time.secs.to_f) * ag_factor
  @ag_time   = M26::ElapsedTime.new(ag_secs)
  @ag_speed  = M26::Speed.new(distance, ag_time)
  # if false
  #   puts "evt age:   #{evt_age.to_s}  #{evt_age.date}"
  #   puts "base age:  #{base_age.to_s} #{base_age.date}"
  #   puts "ag_factor: #{ag_factor}"
  #   puts "ag_secs:   #{ag_secs}"
  #   puts "ag_speed:  #{ag_speed.to_s}"
  #   puts "base pace: #{pace_per_mile}"
  #   puts "base time: #{elapsed_time.as_hhmmss}"
  #   puts "ag   pace: #{ag_speed.pace_per_mile}"
  #   puts "ag   time: #{ag_speed.elapsed_time.as_hhmmss}"
  # end
  @ag_speed
end

#get_kphObject



50
51
52
# File 'lib/m26_speed.rb', line 50

def get_kph
  @distance.get_kilometers / @elapsed_time.as_hours();
end

#get_mphObject



44
45
46
47
48
# File 'lib/m26_speed.rb', line 44

def get_mph
  num = @distance.get_miles.to_f
  den = @elapsed_time.as_hours
  num / den
end

#get_yphObject



54
55
56
# File 'lib/m26_speed.rb', line 54

def get_yph
  @distance.get_yards / @elapsed_time.as_hours();
end

#pace_per_mileObject



58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'lib/m26_speed.rb', line 58

def pace_per_mile
  spm = seconds_per_mile()
  mm  = (spm / 60).floor;
  ss  = spm - (mm * 60);

  if (ss < 10)
    ss = '0' + ss.to_s;
  else
    ss = '' + ss.to_s;
  end
  ss = ss.slice(0..4)
  return "#{mm}:#{ss}";
end

#projected_time(another_distance, algorithm = 'simple', pow = 1.06, debug = false) ⇒ Object



76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/m26_speed.rb', line 76

def projected_time(another_distance, algorithm='simple', pow=1.06, debug=false)
  if (algorithm == 'riegel')
    t1 = @elapsed_time.secs
    d1 = @distance.get_miles
    d2 = another_distance.get_miles
    t2 = t1.to_f * ((d2.to_f / d1.to_f) ** pow)
    et = ElapsedTime.new(t2);
    return et.as_hhmmss
  else
    projSecs = seconds_per_mile() * another_distance.get_miles();
    et = ElapsedTime.new(projSecs);
    return et.as_hhmmss
  end
end

#projected_times(space_delim_distances) ⇒ Object



91
92
93
94
95
96
97
98
99
100
101
# File 'lib/m26_speed.rb', line 91

def projected_times(space_delim_distances)
  results = {}
  array = space_delim_distances.split(' ');
  array.each { |d|
    another_distance = Distance.new(d.to_f, "m");
    projSecs = seconds_per_mile() * another_distance.get_miles();
    et = ElapsedTime.new(projSecs);
    results["#{d}"] = et.as_hhmmss;
  }
  return results;
end

#seconds_per_mileObject



72
73
74
# File 'lib/m26_speed.rb', line 72

def seconds_per_mile
  @elapsed_time.secs / @distance.get_miles
end

#to_sObject



103
104
105
# File 'lib/m26_speed.rb', line 103

def to_s
  return "Speed: miles=#{@distance.get_miles} seconds=#{@elapsed_time.secs} mph=#{get_mph()} kph=#{get_kph()} yph=#{get_yph()}"
end