Class: Tools

Inherits:
Object
  • Object
show all
Defined in:
app/models/tools.rb

Overview

This class keeps all the global common methods.

Constant Summary

SS_MAX =

Maximum value of sum of squares.

10000

Class Method Summary (collapse)

Class Method Details

+ (Integer) calc_distance(point1, point2)

Return calculated distance between 2 points.

Parameters:

  • point1 (Object)

    First point

  • point2 (Object)

    Second point

Returns:

  • (Integer)

    Calculated distance.



58
59
60
# File 'app/models/tools.rb', line 58

def self.calc_distance(point1, point2)
  return Math.sqrt((point1.x - point2.x) ** 2 + (point1.y - point2.y) ** 2)
end

+ (Integer) filter_in_percentage(value)

Return value which was adjusted in percentage. 0.01 is returned if value < 0.01. 99.99 is returned if 99.99 < value.

Parameters:

  • value (Integer)

    To be checked value.

Returns:

  • (Integer)

    Adjusted value.



45
46
47
48
49
50
51
52
# File 'app/models/tools.rb', line 45

def self.filter_in_percentage(value)
  if value < 0.01
    value = 0.01
  elsif value > 99.99
    value = 99.99
  end
  return value
end

+ (Integer) filter_in_range(adjust_max, value)

Return value which was adjusted in range. 0 is returned if value < 0. Adjust_max is returned if adjust_max < value.

Parameters:

  • adjust_max (Integer)

    Maximum value.

  • value (Integer)

    To be checked value.

Returns:

  • (Integer)

    Adjusted value.



31
32
33
34
35
36
37
38
# File 'app/models/tools.rb', line 31

def self.filter_in_range(adjust_max, value)
  if value < 0
    value = 0
  elsif adjust_max < value
    value = adjust_max
  end
  return value
end

+ (Float) gaussian_rand(mean = 0.0, sd = 1.0)

Return normal random number.

Returns:

  • (Float)

    same range as normal distribution.



8
9
10
11
12
13
# File 'app/models/tools.rb', line 8

def self.gaussian_rand(mean = 0.0, sd = 1.0)
	rng = lambda { Kernel.rand }
  theta = 2 * Math::PI * rng.call
  scale = sd * Math.sqrt(-2 * Math.log(1 - rng.call))
  return mean + scale * Math.cos(theta)
end

+ (Boolean) random_boolean

Return random boolean.

Returns:

  • (Boolean)

    50%-true and 50%-false.



17
18
19
20
21
22
23
# File 'app/models/tools.rb', line 17

def self.random_boolean
  if rand(2) > 0
    return true
  else
    return false
  end
end

+ (Array) sort_by_dex(array)

Note:

The parameter is normalized by standard deviation before sorting.

Return arrays which were sorted by the specified parameter.

Returns:

  • (Array)

    .



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'app/models/tools.rb', line 65

def self.sort_by_dex(array)
  sorted_by_dex_array = array.sort{|a,b|
    a.dex <=> b.dex
  }
  avg_dex = sorted_by_dex_array.inject(0.0) {|sum, i| sum += i.dex } / sorted_by_dex_array.size
  var_dex = sorted_by_dex_array.inject(0.0) {|sum ,i| sum += (i.dex - avg_dex)**2 } / sorted_by_dex_array.size
  sd_dex = Math.sqrt(var_dex)
  #p "avg_dex:" + avg_dex.to_s + ",var_dex:" + var_dex.to_s + ",sd_dex:" + sd_dex.to_s
  sorted_by_dex_array.each do |element|
    if var_dex == 0 or sd_dex == 0
      element.ss_dex = element.dex
    else
      element.ss_dex = ((element.dex - avg_dex) / sd_dex * 10 + 50).round(2)*100
      if element.ss_dex < 1
        element.ss_dex = 1
      elsif element.ss_dex > Params::SS_MAX - 1
        element.ss_dex = Params::SS_MAX - 1
      end
    end
  end
end