Class: Geometry::PointZero

Inherits:
Object
  • Object
show all
Defined in:
lib/geometry/point_zero.rb

Overview

An object repesenting a Point at the origin in N-dimensional space

A PointZero object is a Point that will always compare equal to zero and unequal to everything else, regardless of size. You can think of it as an application of the Null Object Pattern.

Accessors collapse

Accessors collapse

Unary operators collapse

Enumerable collapse

Instance Method Summary collapse

Instance Attribute Details

#xObject (readonly)



53
54
55
# File 'lib/geometry/point_zero.rb', line 53

def x
    0
end

#yObject (readonly)



59
60
61
# File 'lib/geometry/point_zero.rb', line 59

def y
    0
end

#zObject (readonly)



65
66
67
# File 'lib/geometry/point_zero.rb', line 65

def z
    0
end

Instance Method Details

#*(other) ⇒ Object



142
143
144
# File 'lib/geometry/point_zero.rb', line 142

def *(other)
    self
end

#+(other) ⇒ Object



120
121
122
123
124
125
126
127
128
# File 'lib/geometry/point_zero.rb', line 120

def +(other)
    case other
	when Array then other
	when Numeric
	    Point.iso(other)
	else
	    Point[other]
    end
end

#+@Object



111
112
113
# File 'lib/geometry/point_zero.rb', line 111

def +@
    self
end

#-(other) ⇒ Object



130
131
132
133
134
135
136
137
138
139
140
# File 'lib/geometry/point_zero.rb', line 130

def -(other)
    if other.is_a? Size
	-Point[other]
    elsif other.is_a? Numeric
	Point.iso(-other)
    elsif other.respond_to? :-@
	-other
    elsif other.respond_to? :map
	other.map {|a| -a }
    end
end

#-@Object



115
116
117
# File 'lib/geometry/point_zero.rb', line 115

def -@
    self
end

#/(other) ⇒ Object



146
147
148
149
150
# File 'lib/geometry/point_zero.rb', line 146

def /(other)
    raise OperationNotDefined unless other.is_a? Numeric
    raise ZeroDivisionError if 0 == other
    self
end

#[](i) ⇒ Numeric

Returns Element i (starting at 0).

Parameters:

Returns:

  • (Numeric)

    Element i (starting at 0)



47
48
49
# File 'lib/geometry/point_zero.rb', line 47

def [](i)
    0
end

#coerce(other) ⇒ Object



22
23
24
25
26
27
28
29
30
31
32
# File 'lib/geometry/point_zero.rb', line 22

def coerce(other)
    if other.is_a? Numeric
	[other, 0]
    elsif other.is_a? Array
	[other, Array.new(other.size,0)]
    elsif other.is_a? Vector
	[other, Vector[*Array.new(other.size,0)]]
    else
	[Point[other], Point[Array.new(other.size,0)]]
    end
end

#eql?(other) ⇒ Boolean Also known as: ==

Returns:

  • (Boolean)


13
14
15
16
17
18
19
# File 'lib/geometry/point_zero.rb', line 13

def eql?(other)
    if other.respond_to? :all?
	other.all? {|e| e.eql? 0}
    else
	other == 0
    end
end

#first(n = nil) ⇒ Object

Return the first, or first n, elements (always 0)

Parameters:

  • n (Number) (defaults to: nil)

    the number of elements to return



157
158
159
# File 'lib/geometry/point_zero.rb', line 157

def first(n=nil)
    Array.new(n, 0) rescue 0
end

#is_a?(klass) ⇒ Boolean Also known as: kind_of?

Returns:

  • (Boolean)


34
35
36
# File 'lib/geometry/point_zero.rb', line 34

def is_a?(klass)
    (klass == Point) || super
end

#max(*args) ⇒ Number, Point

Returns:



74
75
76
77
78
79
80
81
# File 'lib/geometry/point_zero.rb', line 74

def max(*args)
    if args.empty?
	0
    else
	args = args.first if 1 == args.size
	Array.new(args.size, 0).zip(args).map(&:max)
    end
end

#min(*args) ⇒ Number, Point

Returns:



87
88
89
90
91
92
93
94
# File 'lib/geometry/point_zero.rb', line 87

def min(*args)
    if args.empty?
	0
    else
	args = args.first if 1 == args.size
	Array.new(args.size, 0).zip(args).map(&:min)
    end
end

#minmax(*args) ⇒ Array<Number>, Array<Point>

Returns:



100
101
102
103
104
105
106
# File 'lib/geometry/point_zero.rb', line 100

def minmax(*args)
    if args.empty?
	[0, 0]
    else
	[min(*args), max(*args)]
    end
end

#to_aryObject

This is a hack to get Array#== to work properly. It works on ruby 2.0 and 1.9.3.



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

def to_ary
    []
end