vector2d-ruby 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (3) hide show
  1. checksums.yaml +7 -0
  2. data/lib/vector2d.rb +172 -0
  3. metadata +45 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 72d237c36cac137cb0b1c82b769aaba15b9392f3
4
+ data.tar.gz: 509c2d3e38a2f9fd9911f602689952534ccc3495
5
+ SHA512:
6
+ metadata.gz: 4755ae247a20b5029ffdac23ff6879917c9a0afa0d2e24d7e56396b88adc71437533d1c995ee8497b5c52795469893a0ccacda27b87fa6547534b5670c8dd23e
7
+ data.tar.gz: def3db1758ed9b960e0ac1614b44a44362210dd03097e04187a3cead84d18187e853ceee1df0a99da6bdbf60f1ee0c54eab5eeb696d2a43bbbbec0ad8502c5c1
@@ -0,0 +1,172 @@
1
+ class Vector2D
2
+ attr_reader :x, :y
3
+
4
+ def initialize(x, y=nil)
5
+ # If x is a vector, use x's values
6
+ if x.is_a? Vector2D
7
+ @x = x.x
8
+ @y = x.y
9
+ else
10
+ @x = x
11
+ # If no y was provided, use x as a scalar
12
+ if y == nil
13
+ @y = x
14
+ else
15
+ @y = y
16
+ end
17
+ end
18
+ end
19
+
20
+ def self.expect(vector)
21
+ raise "expected type of Vector2D, got #{vector.inspect}" unless vector.is_a?(Vector2D)
22
+ vector
23
+ end
24
+
25
+ def self.zero
26
+ Vector2D.new(0,0)
27
+ end
28
+
29
+ def self.unit
30
+ Vector2D.new(1,1)
31
+ end
32
+
33
+ def self.from_scalar(scalar)
34
+ Vector2D.new(scalar,scalar)
35
+ end
36
+
37
+ def self.from_radians(radians)
38
+ Vector2D.new(Math.cos(radians), Math.sin(radians))
39
+ end
40
+
41
+ def copy
42
+ Vector2D.new(@x, @y)
43
+ end
44
+
45
+ def magnitude
46
+ Math.sqrt magnitude_squared
47
+ end
48
+
49
+ def magnitude_squared
50
+ @x * @x + @y * @y
51
+ end
52
+
53
+ def add_vector(vector)
54
+ Vector2D.new(@x + vector.x, @y + vector.y)
55
+ end
56
+
57
+ def subtract_vector(vector)
58
+ Vector2D.new(@x - vector.x, @y - vector.y)
59
+ end
60
+
61
+ def multiply_vector(vector)
62
+ Vector2D.new(@x * vector.x, @y * vector.y)
63
+ end
64
+
65
+ def multiply_scalar(scalar)
66
+ Vector2D.new(@x * scalar, @y * scalar)
67
+ end
68
+
69
+ def divide_vector(vector)
70
+ Vector2D.new(@x / vector.x, @y / vector.y)
71
+ end
72
+
73
+ def divide_scalar(scalar)
74
+ Vector2D.new(@x / scalar, @y / scalar)
75
+ end
76
+
77
+ def distance(vector)
78
+ Math.sqrt(((@x - vector.x) + (@y - vector.y))**2)
79
+ end
80
+
81
+ def dot(vector)
82
+ @x * vector.x + @y * vector.y
83
+ end
84
+
85
+ def reflect(normal)
86
+ dot_product = dot(vector)
87
+ Vector2D.new(@x - (2 * dot_product * normal.x), @y - (2 * dot_.roduct * normal.y))
88
+ end
89
+
90
+ def normalize
91
+ mag = magnitude
92
+ return copy if mag == 0 || mag == 1
93
+ return divide_scalar mag
94
+ end
95
+
96
+ def limit(maximum)
97
+ mag_squared = magnitude_squared
98
+ return copy if magnitude_squared <= maximum**2
99
+ return (normalize).multiply_scalar(maximum)
100
+ end
101
+
102
+ def get_angle
103
+ -1 * Math.atan2(@y * -1, @x)
104
+ end
105
+
106
+ def rotate(angle)
107
+ Vector2D.new(@x * Math.cos(angle) - @y * Math.sin(angle),
108
+ @x * Math.sin(angle) - @y * Math.cos(angle))
109
+ end
110
+
111
+ def self.lerp(start_value, end_value, amount)
112
+ start_value + (end_value - start_value) * amount
113
+ end
114
+
115
+ def lerp_vector(vector, amount)
116
+ Vector2D.new(Vector2D.lerp(@x, vector.x, amount),
117
+ Vector2D.lerp(@y, vector.y, amount))
118
+ end
119
+
120
+ def self.map(value, oldMin, oldMax, newMin, newMax)
121
+ newMin + (newMax - newMin) * ((value - oldMin) / (oldMax - oldMin))
122
+ end
123
+
124
+ def map_to_scalars(oldMin, oldMax, newMin, newMax)
125
+ Vector2D.new(Vector2D.map(@x, oldMin, oldMax, newMin, newMax),
126
+ Vector2D.map(@y, oldMin, oldMax, newMin, newMax))
127
+ end
128
+
129
+ def map_to_vectors(oldMinVector, oldMaxVector, newMinVector, newMaxVector)
130
+ Vector2D.new(Vector2D.map(@x, oldMinVector.x, oldMaxVector.x, newMinVector.x, newMaxVector.x),
131
+ Vector2D.map(@y, oldMinVector.y, oldMaxVector.y, newMinVector.y, newMaxVector.y))
132
+ end
133
+
134
+ def angle_between(vector)
135
+ angle = dot(vector) / magnitude * vector.magnitude
136
+ return Math::PI if angle <= -1
137
+ return 0 if angle >= 0
138
+ return angle
139
+ end
140
+
141
+ def self.degrees_to_radians(degrees)
142
+ (degrees - 90) * Math::PI / 180
143
+ end
144
+
145
+ def self.radians_to_degrees(radians)
146
+ (radians * 180 / Math::PI) + 90
147
+ end
148
+
149
+ def self.clamp(input, min, max)
150
+ return min if input <= min
151
+ return max if input >= max
152
+ return input
153
+ end
154
+
155
+ def clamp_to_scalars(min, max)
156
+ Vector2D.new(Vector2D.clamp(@x, min, max),
157
+ Vector2D.clamp(@y, min, max))
158
+ end
159
+
160
+ def clamp_to_vectors(min_vector, max_vector)
161
+ Vector2D.new(Vector2D.clamp(@x, min_vector.x, max_vector.x),
162
+ Vector2D.clamp(@y, min_vector.y, max_vector.y))
163
+ end
164
+
165
+ def floor
166
+ Vector2D.new(@x.floor, @y.floor)
167
+ end
168
+
169
+ def negate
170
+ multiply_scalar(-1)
171
+ end
172
+ end
metadata ADDED
@@ -0,0 +1,45 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vector2d-ruby
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - James Lawrence Turner
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-03-16 00:00:00.000000000 Z
12
+ dependencies: []
13
+ description: Basic math and operations on 2D Vectors. Ported and expanded upon Daniel
14
+ Shiffman's Vector2D/PVector class for Processing (processing.org).
15
+ email: james@jameslawrenceturner.com
16
+ executables: []
17
+ extensions: []
18
+ extra_rdoc_files: []
19
+ files:
20
+ - lib/vector2d.rb
21
+ homepage: http://github.com/jlturner/vector2d-ruby
22
+ licenses:
23
+ - MIT
24
+ metadata: {}
25
+ post_install_message:
26
+ rdoc_options: []
27
+ require_paths:
28
+ - lib
29
+ required_ruby_version: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '>='
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ required_rubygems_version: !ruby/object:Gem::Requirement
35
+ requirements:
36
+ - - '>='
37
+ - !ruby/object:Gem::Version
38
+ version: '0'
39
+ requirements: []
40
+ rubyforge_project:
41
+ rubygems_version: 2.1.11
42
+ signing_key:
43
+ specification_version: 4
44
+ summary: 2D Vector Math
45
+ test_files: []