Class: RubySketch::Processing::Vector
- Inherits:
-
Object
- Object
- RubySketch::Processing::Vector
- Includes:
- Comparable
- Defined in:
- lib/rubysketch/processing.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 ⇒ Array
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.
-
#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.
37 38 39 40 41 42 43 44 45 |
# File 'lib/rubysketch/processing.rb', line 37 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.
279 280 281 282 283 |
# File 'lib/rubysketch/processing.rb', line 279 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.
507 508 509 510 511 512 513 514 515 516 |
# File 'lib/rubysketch/processing.rb', line 507 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.
463 464 465 |
# File 'lib/rubysketch/processing.rb', line 463 def self.cross(v1, v2, target = nil) v1.cross v2, target end |
.dist(v1, v2) ⇒ Numeric
Returns the distance of 2 vectors.
404 405 406 |
# File 'lib/rubysketch/processing.rb', line 404 def self.dist(v1, v2) v1.dist v2 end |
.div(v, num) ⇒ Vector .div(v, num, target) ⇒ Vector
Divides a vector by scalar.
330 331 332 333 334 |
# File 'lib/rubysketch/processing.rb', line 330 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.
432 433 434 |
# File 'lib/rubysketch/processing.rb', line 432 def self.dot(v1, v2) v1.dot v2 end |
.fromAngle(angle, target = nil) ⇒ Vector
Returns rotated new vector.
494 495 496 497 498 |
# File 'lib/rubysketch/processing.rb', line 494 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.
158 159 160 |
# File 'lib/rubysketch/processing.rb', line 158 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.
313 314 315 316 317 |
# File 'lib/rubysketch/processing.rb', line 313 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.
524 525 526 527 528 |
# File 'lib/rubysketch/processing.rb', line 524 def self.random2D(target = nil) v = self.fromAngle rand 0.0...(Math::PI * 2) target.set v if target v end |
.random3D(target = nil) ⇒ Vector
Returns a new 3D unit vector with a random direction.
536 537 538 539 540 541 542 543 544 545 |
# File 'lib/rubysketch/processing.rb', line 536 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.
254 255 256 |
# File 'lib/rubysketch/processing.rb', line 254 def *(num) dup.mult num end |
#+(v) ⇒ Vector
Adds a vector.
234 235 236 |
# File 'lib/rubysketch/processing.rb', line 234 def +(v) dup.add v end |
#-(v) ⇒ Vector
Subtracts a vector.
244 245 246 |
# File 'lib/rubysketch/processing.rb', line 244 def -(v) dup.sub v end |
#/(num) ⇒ Vector
Divides a vector by scalar.
264 265 266 |
# File 'lib/rubysketch/processing.rb', line 264 def /(num) dup.div num end |
#add(v) ⇒ Vector #add(x, y) ⇒ Vector #add(x, y, z) ⇒ Vector
Adds a vector.
183 184 185 186 |
# File 'lib/rubysketch/processing.rb', line 183 def add(*args) @point += toVector__(*args).getInternal__ self end |
#array ⇒ Array
Returns x, y, z as an array
166 167 168 |
# File 'lib/rubysketch/processing.rb', line 166 def array() @point.to_a 3 end |
#cross(v) ⇒ Numeric #cross(x, y) ⇒ Numeric #cross(x, y, z) ⇒ Numeric
Calculates the cross product of 2 vectors.
449 450 451 452 453 454 |
# File 'lib/rubysketch/processing.rb', line 449 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.
393 394 395 |
# File 'lib/rubysketch/processing.rb', line 393 def dist(v) (self - v).mag end |
#div(num) ⇒ Vector
Divides a vector by scalar.
223 224 225 226 |
# File 'lib/rubysketch/processing.rb', line 223 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.
421 422 423 |
# File 'lib/rubysketch/processing.rb', line 421 def dot(*args) Rays::Point::dot getInternal__, toVector__(*args).getInternal__ end |
#heading ⇒ Numeric
Returns the angle of rotation for this vector.
483 484 485 |
# File 'lib/rubysketch/processing.rb', line 483 def heading() Math.atan2 y, x end |
#initialize_copy(o) ⇒ Object
Initializer for dup or clone
49 50 51 |
# File 'lib/rubysketch/processing.rb', line 49 def initialize_copy(o) @point = o.getInternal__.dup end |
#lerp(v, amount) ⇒ Vector #lerp(x, y, amount) ⇒ Vector #lerp(x, y, z, amount) ⇒ Vector
Returns the interpolated vector between 2 vectors.
142 143 144 145 146 147 148 |
# File 'lib/rubysketch/processing.rb', line 142 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.
382 383 384 385 |
# File 'lib/rubysketch/processing.rb', line 382 def limit(max) setMag max if magSq > max ** 2 self end |
#mag ⇒ Numeric
Returns the length of the vector.
340 341 342 |
# File 'lib/rubysketch/processing.rb', line 340 def mag() @point.length end |
#magSq ⇒ Numeric
Returns squared length of the vector.
348 349 350 |
# File 'lib/rubysketch/processing.rb', line 348 def magSq() Rays::Point::dot(@point, @point) end |
#mult(num) ⇒ Vector
Multiplies a vector by scalar.
212 213 214 215 |
# File 'lib/rubysketch/processing.rb', line 212 def mult(num) @point *= num self end |
#normalize(target = nil) ⇒ Vector
Changes the length of the vector to 1.0.
372 373 374 |
# File 'lib/rubysketch/processing.rb', line 372 def normalize(target = nil) (target || self).set @point.normal end |
#rotate(angle) ⇒ Vector
Rotate the vector.
473 474 475 476 477 |
# File 'lib/rubysketch/processing.rb', line 473 def rotate(angle) angle = @context ? @context.toAngle__(angle) : angle * RAD2DEG__ @point.rotate! angle 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/rubysketch/processing.rb', line 75 def set(*args) initialize(*args) self end |
#setMag(len) ⇒ Vector #setMag(target, len) ⇒ Vector
Changes the length of the vector.
362 363 364 |
# File 'lib/rubysketch/processing.rb', line 362 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.
201 202 203 204 |
# File 'lib/rubysketch/processing.rb', line 201 def sub(*args) @point -= toVector__(*args).getInternal__ self end |
#x ⇒ Numeric
Gets x value.
84 85 86 |
# File 'lib/rubysketch/processing.rb', line 84 def x() @point.x end |
#x=(x) ⇒ Numeric
Sets x value.
108 109 110 |
# File 'lib/rubysketch/processing.rb', line 108 def x=(x) @point.x = x end |
#y ⇒ Numeric
Gets y value.
92 93 94 |
# File 'lib/rubysketch/processing.rb', line 92 def y() @point.y end |
#y=(y) ⇒ Numeric
Sets y value.
116 117 118 |
# File 'lib/rubysketch/processing.rb', line 116 def y=(y) @point.y = y end |
#z ⇒ Numeric
Gets z value.
100 101 102 |
# File 'lib/rubysketch/processing.rb', line 100 def z() @point.z end |
#z=(z) ⇒ Numeric
Sets z value.
124 125 126 |
# File 'lib/rubysketch/processing.rb', line 124 def z=(z) @point.z = z end |