Flash Math
Flash Validators is a collection of advance math modules.
Currently supported calculations: geometry and statistics.
Installation
Add this line to your application's Gemfile:
gem 'flash_math'
And then execute:
$ bundle
Or install it yourself as:
$ gem install flash_math
Usage
Geometry
Geometrical Point:
Use the following methods to generate geometical point:
GeometricPoint.new(x, y)
and GeometricPoint.new_by_array(array)
Use the following methods to generate geometical point data:
advance_by(vector)
and to_vector
geo_point = GeometricPoint.new(1, 2)
geo_vector = GeometricVector.new(2, -1)
geo_point.x #=> 1
geo_point.2 #=> 2
geo_point.advance_by(geo_vector) #=> [3, 1]
Geometrical Vector:
Use the following methods to generate geometical vector:
GeometricVector.new(x, y)
and GeometricVector.new_by_array(array)
Use the following methods to generate geometical vector data:
modulus
, collinear_with?(vector)
, cross_product(vector)
, and scalar_product(vector)
geo_vector1 = GeometricVector.new(1, 2)
geo_vector2 = GeometricVector.new(2, 4)
geo_vector1.x #=> 1
geo_vector1.y #=> 2
geo_vector1.modulus #=> 2.23606797749979
geo_vector1.collinear_with?(geo_vector2) #=> true
geo_vector1.cross_product(geo_vector2) #=> 10
geo_vector1.scalar_product(geo_vector2) #=> 0
Geometrical Distance:
Use the following method to generate geometical distance:
GeometricDistance.new(x, y)
and GeometricDistance.new_by_arrays(array)
Use the following methods to generate geometical distance data:
distance
, midpoint
, and midpoint_distance
geo_distance = GeometricalDistance.new_by_array([1, 1], [2, 4])
geo_distance.distance #=> 1
geo_distance.midpoint_distance #=> 0.5
geo_distance.midpoint #=> [2, 3]
Geometrical Line:
Use the following method to generate geometical line:
GeometricLine.new(point1, point2)
and GeometricLine.new_by_arrays(point1, point2)
Use the following methods to generate geometical line data:
angel_to
, distance_to
, horizontal?
, vertical?
, intersect_x
, parallel_to?
, slope
, x_intercept
, and y_intercept
geo_line1 = GeometricLine.new_by_arrays([0, 0], [1, 1])
geo_line2 = GeometricLine.new_by_arrays([0, 0], [1, -1])
point = GeometricPoint.new(3, 4)
geo_line1.angle_to(geo_line2) #=> 1.5707963267948966
geo_line1.distance_to(point) #=> 0.7071067811865475
geo_line1.horizontal? #=> false
geo_line1.vertical? #=> false
geo_line1.intersect_x(geo_line2) #=> 0.0
geo_line1.parallel_to?(geo_line2) #=> false
geo_line1.slope #=> 1.0
geo_line1.x_intercept #=> 0.0
geo_line1.y_intercept #=> 0.0
Geometrical Segment:
Use the following method to generate geometical segment:
GeometricSegment.new(point1, point2)
and GeometricSegment.new_by_arrays(point1, point2)
Use the following methods to generate geometical segment data:
bottommost_endpoint
, leftmost_endpoint
, rightmost_endpoint
, topmost_endpoint
, contains_point?
, distance_to?
, intersection_point_with
, intersects_with?
, length
, lies_on_one_line_with?
, overlaps?
, parallel_to?
, and to_vector
geo_segment1 = GeometricSegment.new_by_arrays([0, 0], [1, 1])
geo_segment2 = GeometricSegment.new_by_arrays([2, 2], [3, 3])
point = GeometricPoint.new(0, 1)
geo_segment1.bottommost_endpoint #=> [0, 0]
geo_segment1.leftmost_endpoint #=> [0, 0]
geo_segment1.rightmost_endpoint #=> [1, 1]
geo_segment1.topmost_endpoint #=> [1, 1]
geo_segment1.contains_point?(point) #=> true
geo_segment1.distance_to?(point) #=> 0.7071067811865476
geo_segment1.intersection_point_with(geo_segment2) #=> GeometricSegmentsDoNotIntersect error
geo_segment1.intersects_with?(geo_segment2) #=> false
geo_segment1.length #=> 1.4142135623730951
geo_segment1.lies_on_one_line_with?(geo_segment2) #=> true
geo_segment1.overlaps?(geo_segment2) #=> false
geo_segment1.parallel_to?(geo_segment2) #=> true
geo_segment1.to_vector #=> [0, 0]
Geometrical Bounding Box:
Use the following method to generate geometical bounding box:
GeometricBoundingBox.new(point1, point2)
and GeometricBoundingBox.new_by_arrays(point1, point2)
Use the following methods to generate geometical segment data:
contains?
and diagonal
geo_bounding_box = GeometricBoundingBox.new_by_arrays([-1, -1], [1, 1])
geo_bounding_box.contains?(GeometricPoint.new(0, 0)) #=> true
Geometrical Polygon:
Use the following method to generate geometical polygon:
GeometricBoundingBox.new(vertices)
Use the following methods to generate geometical polygon data:
area
, bounding_box
, contains
, and edges
geo_polygon = GeometricPolygon.new([GeometricPoint.new(0,0), GeometricPoint.new(1,1), GeometricPoint.new(0,1)]).area
geo_polygon.area #=> 0.5
geo_polygon.contains?(GeometricPoint.new(0.5, 0.5)) #=> true
Statistics
Statistical Spread:
Use the following methods to generate the statistical spreads of an array:
mean
, median
, mean
, range
, min
, max
, percentile_from_value
, value_from_percentile
, variance
, standard_deviation
, relative_standard_deviation
, skewness
, and kurtosis
stats_spread = StatisticalSpread.new([1,1,2,3,10])
stats_spread.mean #=> 3.4
stats_spread.median #=> 2
stats_spread.mode #=> 1
stats_spread.range #=> 9
stats_spread.min #=> 1
stats_spread.max #=> 10
stats_spread.percentile_from_value(10) #=> 80
stats_spread.value_from_percentile(60) #=> 3
stats_spread.variance #=> 14.299999999999999
stats_spread.standard_deviation #=> 3.7815340802378072
stats_spread.relative_standard_deviation #=> 99.47961485463391
stats_spread.skewness #=> 1.188328915820243
stats_spread.kurtosis #=> 2.405613966453127
Contributing
- Fork it ( http://github.com/
/flash_math/fork ) - Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request