Class: Processing::Vector
- Inherits:
-
Object
- Object
- Processing::Vector
- Includes:
- Comparable
- Defined in:
- lib/processing/vector.rb
Overview
Vector class.
Class Method Summary collapse
-
.add(v1, v2, target = nil) ⇒ Vector
Adds 2 vectors.
-
.angleBetween(v1, v2) ⇒ Numeric
Returns angle between 2 vectors.
-
.cross(v1, v2, target = nil) ⇒ Numeric
Calculates the cross product of 2 vectors.
-
.dist(v1, v2) ⇒ Numeric
Returns the distance of 2 vectors.
-
.div(v1, num, target = nil) ⇒ Vector
Divides a vector by scalar.
-
.dot(v1, v2) ⇒ Numeric
Calculates the dot product of 2 vectors.
-
.fromAngle(angle, target = nil) ⇒ Vector
Returns rotated new vector.
-
.lerp(v1, v2, amount) ⇒ Vector
Returns the interpolated vector between 2 vectors.
-
.mult(v1, num, target = nil) ⇒ Vector
Multiplies a vector by scalar.
-
.random2D(target = nil) ⇒ Vector
Returns a new 2D unit vector with a random direction.
-
.random3D(target = nil) ⇒ Vector
Returns a new 3D unit vector with a random direction.
-
.sub(v1, v2, target = nil) ⇒ Vector
Subtracts 2 vectors.
Instance Method Summary collapse
-
#*(num) ⇒ Vector
Multiplies a vector by scalar.
-
#+(v) ⇒ Vector
Adds a vector.
-
#-(v) ⇒ Vector
Subtracts a vector.
-
#/(num) ⇒ Vector
Divides a vector by scalar.
-
#add(*args) ⇒ Vector
Adds a vector.
-
#array(n = 3) ⇒ Array
(also: #to_a)
Returns x, y, z as an array.
-
#cross(a, *rest) ⇒ Numeric
Calculates the cross product of 2 vectors.
-
#dist(v) ⇒ Numeric
Returns the distance of 2 vectors.
-
#div(num) ⇒ Vector
Divides a vector by scalar.
-
#dot(*args) ⇒ Numeric
Calculates the dot product of 2 vectors.
-
#heading ⇒ Numeric
Returns the angle of rotation for this vector.
-
#initialize(x = 0, y = 0, z = 0, context: nil) ⇒ Vector
constructor
Initialize vector object.
-
#initialize_copy(o) ⇒ Object
Initializer for dup or clone.
-
#inspect ⇒ String
Returns a string containing a human-readable representation of object.
-
#lerp(*args, amount) ⇒ Vector
Returns the interpolated vector between 2 vectors.
-
#limit(max) ⇒ Vector
Changes the length of the vector if it’s length is greater than the max value.
-
#mag ⇒ Numeric
Returns the length of the vector.
-
#magSq ⇒ Numeric
Returns squared length of the vector.
-
#mult(num) ⇒ Vector
Multiplies a vector by scalar.
-
#normalize(target = nil) ⇒ Vector
Changes the length of the vector to 1.0.
-
#rotate(angle) ⇒ Vector
Rotate the vector.
-
#set(*args) ⇒ nil
Sets x, y and z.
-
#setMag(target = nil, len) ⇒ Vector
Changes the length of the vector.
-
#sub(*args) ⇒ Vector
Subtracts a vector.
-
#x ⇒ Numeric
Gets x value.
-
#x=(x) ⇒ Numeric
Sets x value.
-
#y ⇒ Numeric
Gets y value.
-
#y=(y) ⇒ Numeric
Sets y value.
-
#z ⇒ Numeric
Gets z value.
-
#z=(z) ⇒ Numeric
Sets z value.
Constructor Details
#new ⇒ Vector #new(x) ⇒ Vector #new(x, y) ⇒ Vector #new(x, y, z) ⇒ Vector #new(v) ⇒ Vector #new(a) ⇒ Vector
Initialize vector object.
31 32 33 34 35 36 37 38 39 |
# File 'lib/processing/vector.rb', line 31 def initialize(x = 0, y = 0, z = 0, context: nil) @point = case x when Rays::Point then x.dup when Vector then x.getInternal__.dup when Array then Rays::Point.new x[0] || 0, x[1] || 0, x[2] || 0 else Rays::Point.new x || 0, y || 0, z || 0 end @context = context || Context.context__ end |
Class Method Details
.add(v1, v2) ⇒ Vector .add(v1, v2, target) ⇒ Vector
Adds 2 vectors.
337 338 339 340 341 |
# File 'lib/processing/vector.rb', line 337 def self.add(v1, v2, target = nil) v = v1 + v2 target.set v if self === target v end |
.angleBetween(v1, v2) ⇒ Numeric
Returns angle between 2 vectors.
620 621 622 623 624 625 626 627 628 629 |
# File 'lib/processing/vector.rb', line 620 def self.angleBetween(v1, v2) x1, y1, z1 = v1.array x2, y2, z2 = v2.array return 0 if (x1 == 0 && y1 == 0 && z1 == 0) || (x2 == 0 && y2 == 0 && z2 == 0) x = dot(v1, v2) / (v1.mag * v2.mag) return Math::PI if x <= -1 return 0 if x >= 1 return Math.acos x end |
.cross(v1, v2, target = nil) ⇒ Numeric
Calculates the cross product of 2 vectors.
563 564 565 |
# File 'lib/processing/vector.rb', line 563 def self.cross(v1, v2, target = nil) v1.cross v2, target end |
.dist(v1, v2) ⇒ Numeric
Returns the distance of 2 vectors.
492 493 494 |
# File 'lib/processing/vector.rb', line 492 def self.dist(v1, v2) v1.dist v2 end |
.div(v, num) ⇒ Vector .div(v, num, target) ⇒ Vector
Divides a vector by scalar.
397 398 399 400 401 |
# File 'lib/processing/vector.rb', line 397 def self.div(v1, num, target = nil) v = v1 / num target.set v if self === target v end |
.dot(v1, v2) ⇒ Numeric
Calculates the dot product of 2 vectors.
526 527 528 |
# File 'lib/processing/vector.rb', line 526 def self.dot(v1, v2) v1.dot v2 end |
.fromAngle(angle, target = nil) ⇒ Vector
Returns rotated new vector.
604 605 606 607 608 |
# File 'lib/processing/vector.rb', line 604 def self.fromAngle(angle, target = nil) v = self.new(1, 0, 0).rotate(angle) target.set v if target v end |
.lerp(v1, v2, amount) ⇒ Vector
Returns the interpolated vector between 2 vectors.
182 183 184 |
# File 'lib/processing/vector.rb', line 182 def self.lerp(v1, v2, amount) v1.dup.lerp v2, amount end |
.mult(v, num) ⇒ Vector .mult(v, num, target) ⇒ Vector
Multiplies a vector by scalar.
377 378 379 380 381 |
# File 'lib/processing/vector.rb', line 377 def self.mult(v1, num, target = nil) v = v1 * num target.set v if self === target v end |
.random2D(target = nil) ⇒ Vector
Returns a new 2D unit vector with a random direction.
640 641 642 643 644 645 |
# File 'lib/processing/vector.rb', line 640 def self.random2D(target = nil) v = self.new(1, 0, 0) v.getInternal__.rotate! rand 0.0...360.0 target.set v if target v end |
.random3D(target = nil) ⇒ Vector
Returns a new 3D unit vector with a random direction.
656 657 658 659 660 661 662 663 664 665 |
# File 'lib/processing/vector.rb', line 656 def self.random3D(target = nil) angle = rand 0.0...(Math::PI * 2) z = rand(-1.0..1.0) z2 = z ** 2 x = Math.sqrt(1.0 - z2) * Math.cos(angle) y = Math.sqrt(1.0 - z2) * Math.sin(angle) v = self.new x, y, z target.set v if target v end |
Instance Method Details
#*(num) ⇒ Vector
Multiplies a vector by scalar.
306 307 308 |
# File 'lib/processing/vector.rb', line 306 def *(num) dup.mult num end |
#+(v) ⇒ Vector
Adds a vector.
280 281 282 |
# File 'lib/processing/vector.rb', line 280 def +(v) dup.add v end |
#-(v) ⇒ Vector
Subtracts a vector.
293 294 295 |
# File 'lib/processing/vector.rb', line 293 def -(v) dup.sub v end |
#/(num) ⇒ Vector
Divides a vector by scalar.
319 320 321 |
# File 'lib/processing/vector.rb', line 319 def /(num) dup.div num end |
#add(v) ⇒ Vector #add(x, y) ⇒ Vector #add(x, y, z) ⇒ Vector
Adds a vector.
217 218 219 220 |
# File 'lib/processing/vector.rb', line 217 def add(*args) @point += toVector__(*args).getInternal__ self end |
#array(n = 3) ⇒ Array Also known as: to_a
Returns x, y, z as an array
195 196 197 |
# File 'lib/processing/vector.rb', line 195 def array(n = 3) @point.to_a n end |
#cross(v) ⇒ Numeric #cross(x, y) ⇒ Numeric #cross(x, y, z) ⇒ Numeric
Calculates the cross product of 2 vectors.
546 547 548 549 550 551 |
# File 'lib/processing/vector.rb', line 546 def cross(a, *rest) target = self.class === rest.last ? rest.pop : nil v = self.class.new Rays::Point::cross getInternal__, toVector__(a, *rest).getInternal__ target.set v if self.class === target v end |
#dist(v) ⇒ Numeric
Returns the distance of 2 vectors.
478 479 480 |
# File 'lib/processing/vector.rb', line 478 def dist(v) (self - v).mag end |
#div(num) ⇒ Vector
Divides a vector by scalar.
266 267 268 269 |
# File 'lib/processing/vector.rb', line 266 def div(num) @point /= num self end |
#dot(v) ⇒ Numeric #dot(x, y) ⇒ Numeric #dot(x, y, z) ⇒ Numeric
Calculates the dot product of 2 vectors.
512 513 514 |
# File 'lib/processing/vector.rb', line 512 def dot(*args) Rays::Point::dot getInternal__, toVector__(*args).getInternal__ end |
#heading ⇒ Numeric
Returns the angle of rotation for this vector.
590 591 592 |
# File 'lib/processing/vector.rb', line 590 def heading() Math.atan2 y, x end |
#initialize_copy(o) ⇒ Object
Initializer for dup or clone
43 44 45 |
# File 'lib/processing/vector.rb', line 43 def initialize_copy(o) @point = o.getInternal__.dup end |
#inspect ⇒ String
Returns a string containing a human-readable representation of object.
671 672 673 |
# File 'lib/processing/vector.rb', line 671 def inspect() "#<#{self.class.name}: #{x}, #{y}, #{z}>" end |
#lerp(v, amount) ⇒ Vector #lerp(x, y, amount) ⇒ Vector #lerp(x, y, z, amount) ⇒ Vector
Returns the interpolated vector between 2 vectors.
163 164 165 166 167 168 169 |
# File 'lib/processing/vector.rb', line 163 def lerp(*args, amount) v = toVector__(*args) self.x = x + (v.x - x) * amount self.y = y + (v.y - y) * amount self.z = z + (v.z - z) * amount self end |
#limit(max) ⇒ Vector
Changes the length of the vector if it’s length is greater than the max value.
464 465 466 467 |
# File 'lib/processing/vector.rb', line 464 def limit(max) setMag max if magSq > max ** 2 self end |
#mag ⇒ Numeric
Returns the length of the vector.
410 411 412 |
# File 'lib/processing/vector.rb', line 410 def mag() @point.length end |
#magSq ⇒ Numeric
Returns squared length of the vector.
421 422 423 |
# File 'lib/processing/vector.rb', line 421 def magSq() Rays::Point::dot(@point, @point) end |
#mult(num) ⇒ Vector
Multiplies a vector by scalar.
252 253 254 255 |
# File 'lib/processing/vector.rb', line 252 def mult(num) @point *= num self end |
#normalize(target = nil) ⇒ Vector
Changes the length of the vector to 1.0.
451 452 453 |
# File 'lib/processing/vector.rb', line 451 def normalize(target = nil) (target || self).set @point.normal end |
#rotate(angle) ⇒ Vector
Rotate the vector.
576 577 578 579 580 581 |
# File 'lib/processing/vector.rb', line 576 def rotate(angle) deg = @context ? @context.toDegrees__(angle) : angle * GraphicsContext::RAD2DEG__ @point.rotate! deg self end |
#set(x) ⇒ nil #set(x, y) ⇒ nil #set(x, y, z) ⇒ nil #set(v) ⇒ nil #set(a) ⇒ nil
Sets x, y and z.
75 76 77 78 |
# File 'lib/processing/vector.rb', line 75 def set(*args) initialize(*args) self end |
#setMag(len) ⇒ Vector #setMag(target, len) ⇒ Vector
Changes the length of the vector.
438 439 440 |
# File 'lib/processing/vector.rb', line 438 def setMag(target = nil, len) (target || self).set @point.normal * len end |
#sub(v) ⇒ Vector #sub(x, y) ⇒ Vector #sub(x, y, z) ⇒ Vector
Subtracts a vector.
238 239 240 241 |
# File 'lib/processing/vector.rb', line 238 def sub(*args) @point -= toVector__(*args).getInternal__ self end |
#x ⇒ Numeric
Gets x value.
87 88 89 |
# File 'lib/processing/vector.rb', line 87 def x() @point.x end |
#x=(x) ⇒ Numeric
Sets x value.
120 121 122 |
# File 'lib/processing/vector.rb', line 120 def x=(x) @point.x = x end |
#y ⇒ Numeric
Gets y value.
98 99 100 |
# File 'lib/processing/vector.rb', line 98 def y() @point.y end |
#y=(y) ⇒ Numeric
Sets y value.
131 132 133 |
# File 'lib/processing/vector.rb', line 131 def y=(y) @point.y = y end |
#z ⇒ Numeric
Gets z value.
109 110 111 |
# File 'lib/processing/vector.rb', line 109 def z() @point.z end |
#z=(z) ⇒ Numeric
Sets z value.
142 143 144 |
# File 'lib/processing/vector.rb', line 142 def z=(z) @point.z = z end |