Module: Vector
- Defined in:
- lib/nswtopo/geometry/vector.rb
Instance Method Summary collapse
- #/(scalar) ⇒ Object
- #angle ⇒ Object
- #cross(other) ⇒ Object
- #dot(other) ⇒ Object
- #minus(other) ⇒ Object
- #negate ⇒ Object
- #norm ⇒ Object
- #normalised ⇒ Object
- #perp ⇒ Object
- #plus(other) ⇒ Object
- #proj(other) ⇒ Object
- #rotate_by(angle) ⇒ Object
- #rotate_by!(angle) ⇒ Object
- #rotate_by_degrees(angle) ⇒ Object
- #rotate_by_degrees!(angle) ⇒ Object
- #times(scalar) ⇒ Object
- #to_d ⇒ Object
- #to_f ⇒ Object
- #within?(polygon) ⇒ Boolean
Instance Method Details
#/(scalar) ⇒ Object
36 37 38 |
# File 'lib/nswtopo/geometry/vector.rb', line 36 def /(scalar) map { |value| value / scalar } end |
#angle ⇒ Object
52 53 54 |
# File 'lib/nswtopo/geometry/vector.rb', line 52 def angle Math::atan2 at(1), at(0) end |
#cross(other) ⇒ Object
72 73 74 |
# File 'lib/nswtopo/geometry/vector.rb', line 72 def cross(other) perp.dot other end |
#dot(other) ⇒ Object
28 29 30 |
# File 'lib/nswtopo/geometry/vector.rb', line 28 def dot(other) [self, other].transpose.map { |values| values.inject(:*) }.inject(:+) end |
#minus(other) ⇒ Object
24 25 26 |
# File 'lib/nswtopo/geometry/vector.rb', line 24 def minus(other) [self, other].transpose.map { |values| values.inject(:-) } end |
#negate ⇒ Object
40 41 42 |
# File 'lib/nswtopo/geometry/vector.rb', line 40 def negate map { |value| -value } end |
#norm ⇒ Object
56 57 58 |
# File 'lib/nswtopo/geometry/vector.rb', line 56 def norm Math::sqrt(dot self) end |
#normalised ⇒ Object
60 61 62 |
# File 'lib/nswtopo/geometry/vector.rb', line 60 def normalised self / norm end |
#perp ⇒ Object
68 69 70 |
# File 'lib/nswtopo/geometry/vector.rb', line 68 def perp [-self[1], self[0]] end |
#plus(other) ⇒ Object
20 21 22 |
# File 'lib/nswtopo/geometry/vector.rb', line 20 def plus(other) [self, other].transpose.map { |values| values.inject(:+) } end |
#proj(other) ⇒ Object
64 65 66 |
# File 'lib/nswtopo/geometry/vector.rb', line 64 def proj(other) dot(other) / other.norm end |
#rotate_by(angle) ⇒ Object
2 3 4 5 6 |
# File 'lib/nswtopo/geometry/vector.rb', line 2 def rotate_by(angle) cos = Math::cos(angle) sin = Math::sin(angle) [self[0] * cos - self[1] * sin, self[0] * sin + self[1] * cos] end |
#rotate_by!(angle) ⇒ Object
8 9 10 |
# File 'lib/nswtopo/geometry/vector.rb', line 8 def rotate_by!(angle) replace rotate_by(angle) end |
#rotate_by_degrees(angle) ⇒ Object
12 13 14 |
# File 'lib/nswtopo/geometry/vector.rb', line 12 def rotate_by_degrees(angle) rotate_by(angle * Math::PI / 180.0) end |
#rotate_by_degrees!(angle) ⇒ Object
16 17 18 |
# File 'lib/nswtopo/geometry/vector.rb', line 16 def rotate_by_degrees!(angle) replace rotate_by_degrees(angle) end |
#times(scalar) ⇒ Object
32 33 34 |
# File 'lib/nswtopo/geometry/vector.rb', line 32 def times(scalar) map { |value| value * scalar } end |
#to_d ⇒ Object
44 45 46 |
# File 'lib/nswtopo/geometry/vector.rb', line 44 def to_d map(&:to_d) end |
#to_f ⇒ Object
48 49 50 |
# File 'lib/nswtopo/geometry/vector.rb', line 48 def to_f map(&:to_f) end |
#within?(polygon) ⇒ Boolean
76 77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'lib/nswtopo/geometry/vector.rb', line 76 def within?(polygon) polygon.map do |point| point.minus self end.ring.inject(0) do |winding, (p0, p1)| case when p1[1] > 0 && p0[1] <= 0 && p0.minus(p1).cross(p0) >= 0 then winding + 1 when p0[1] > 0 && p1[1] <= 0 && p1.minus(p0).cross(p0) >= 0 then winding - 1 when p0[1] == 0 && p1[1] == 0 && p0[0] >= 0 && p1[0] < 0 then winding + 1 when p0[1] == 0 && p1[1] == 0 && p1[0] >= 0 && p0[0] < 0 then winding - 1 else winding end end != 0 end |