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.
- checksums.yaml +7 -0
- data/lib/vector2d.rb +172 -0
- metadata +45 -0
checksums.yaml
ADDED
@@ -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
|
data/lib/vector2d.rb
ADDED
@@ -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: []
|