Module: Vector

Defined in:
lib/nswtopo/geometry/vector.rb

Instance Method Summary collapse

Instance Method Details

#/(scalar) ⇒ Object



36
37
38
# File 'lib/nswtopo/geometry/vector.rb', line 36

def /(scalar)
  map { |value| value / scalar }
end

#angleObject



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

#negateObject



40
41
42
# File 'lib/nswtopo/geometry/vector.rb', line 40

def negate
  map { |value| -value }
end

#normObject



56
57
58
# File 'lib/nswtopo/geometry/vector.rb', line 56

def norm
  Math::sqrt(dot self)
end

#normalisedObject



60
61
62
# File 'lib/nswtopo/geometry/vector.rb', line 60

def normalised
  self / norm
end

#perpObject



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_dObject



44
45
46
# File 'lib/nswtopo/geometry/vector.rb', line 44

def to_d
  map(&:to_d)
end

#to_fObject



48
49
50
# File 'lib/nswtopo/geometry/vector.rb', line 48

def to_f
  map(&:to_f)
end

#within?(polygon) ⇒ Boolean

Returns:

  • (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