geometry-in-ruby 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +6 -0
- data/Gemfile +7 -0
- data/LICENSE +21 -0
- data/README.markdown +105 -0
- data/Rakefile +24 -0
- data/geometry-in-ruby.gemspec +23 -0
- data/lib/geometry/arc.rb +94 -0
- data/lib/geometry/circle.rb +122 -0
- data/lib/geometry/cluster_factory.rb +15 -0
- data/lib/geometry/edge.rb +140 -0
- data/lib/geometry/line.rb +154 -0
- data/lib/geometry/obround.rb +238 -0
- data/lib/geometry/path.rb +67 -0
- data/lib/geometry/point.rb +163 -0
- data/lib/geometry/point_zero.rb +107 -0
- data/lib/geometry/polygon.rb +368 -0
- data/lib/geometry/polyline.rb +318 -0
- data/lib/geometry/rectangle.rb +378 -0
- data/lib/geometry/regular_polygon.rb +136 -0
- data/lib/geometry/rotation.rb +190 -0
- data/lib/geometry/size.rb +75 -0
- data/lib/geometry/size_zero.rb +70 -0
- data/lib/geometry/square.rb +113 -0
- data/lib/geometry/text.rb +24 -0
- data/lib/geometry/transformation/composition.rb +39 -0
- data/lib/geometry/transformation.rb +171 -0
- data/lib/geometry/triangle.rb +78 -0
- data/lib/geometry/vector.rb +34 -0
- data/lib/geometry.rb +22 -0
- data/test/geometry/arc.rb +25 -0
- data/test/geometry/circle.rb +112 -0
- data/test/geometry/edge.rb +132 -0
- data/test/geometry/line.rb +132 -0
- data/test/geometry/obround.rb +25 -0
- data/test/geometry/path.rb +66 -0
- data/test/geometry/point.rb +258 -0
- data/test/geometry/point_zero.rb +177 -0
- data/test/geometry/polygon.rb +214 -0
- data/test/geometry/polyline.rb +266 -0
- data/test/geometry/rectangle.rb +154 -0
- data/test/geometry/regular_polygon.rb +120 -0
- data/test/geometry/rotation.rb +108 -0
- data/test/geometry/size.rb +97 -0
- data/test/geometry/size_zero.rb +153 -0
- data/test/geometry/square.rb +66 -0
- data/test/geometry/transformation/composition.rb +49 -0
- data/test/geometry/transformation.rb +169 -0
- data/test/geometry/triangle.rb +32 -0
- data/test/geometry/vector.rb +41 -0
- data/test/geometry.rb +5 -0
- metadata +117 -0
@@ -0,0 +1,169 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'geometry/point'
|
3
|
+
require 'geometry/transformation'
|
4
|
+
|
5
|
+
describe Geometry::Transformation do
|
6
|
+
Transformation = Geometry::Transformation
|
7
|
+
|
8
|
+
describe "when constructed" do
|
9
|
+
it "must accept nothing and become an identity transformation" do
|
10
|
+
Transformation.new.identity?.must_equal true
|
11
|
+
end
|
12
|
+
|
13
|
+
it "must accept a translate parameter" do
|
14
|
+
Transformation.new([4,2]).translation.must_equal Point[4,2]
|
15
|
+
end
|
16
|
+
|
17
|
+
it "must accept a translate Array" do
|
18
|
+
translate = Transformation.new(:translate => [4,2])
|
19
|
+
translate.translation.must_equal Point[4,2]
|
20
|
+
end
|
21
|
+
|
22
|
+
it "must accept a translate Point" do
|
23
|
+
translate = Transformation.new(:translate => Point[4,2])
|
24
|
+
translate.translation.must_equal Point[4,2]
|
25
|
+
end
|
26
|
+
|
27
|
+
it "must accept a translate Point equal to zero" do
|
28
|
+
translate = Transformation.new(:translate => [0,0])
|
29
|
+
translate.translation.must_equal nil
|
30
|
+
end
|
31
|
+
|
32
|
+
it "must accept a translate Vector" do
|
33
|
+
translate = Transformation.new(:translate => Vector[4,2])
|
34
|
+
translate.translation.must_equal Point[4,2]
|
35
|
+
end
|
36
|
+
|
37
|
+
it "must accept an origin option" do
|
38
|
+
translate = Transformation.new(:origin => [4,2])
|
39
|
+
translate.translation.must_equal Point[4,2]
|
40
|
+
end
|
41
|
+
|
42
|
+
it "must raise an exception when given too many translation options" do
|
43
|
+
lambda { Transformation.new :translate => [1,2], :origin => [3,4] }.must_raise ArgumentError
|
44
|
+
end
|
45
|
+
|
46
|
+
describe "when given a dimensions option" do
|
47
|
+
it "must raise an exception if the other arguments are too big" do
|
48
|
+
lambda { Transformation.new :dimensions => 2, :origin => [1,2,3] }.must_raise ArgumentError
|
49
|
+
end
|
50
|
+
|
51
|
+
it "must raise an exception if the other arguments are too small" do
|
52
|
+
lambda { Transformation.new :dimensions => 3, :origin => [1,2] }.must_raise ArgumentError
|
53
|
+
end
|
54
|
+
|
55
|
+
it "must not complain when given only a dimensions option" do
|
56
|
+
Transformation.new(:dimensions => 3).dimensions.must_equal 3
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "rotation" do
|
61
|
+
it "must accept a y axis option" do
|
62
|
+
t = Transformation.new :y => [1,0]
|
63
|
+
t.rotation.y.must_equal [1,0]
|
64
|
+
t.identity?.wont_equal true
|
65
|
+
end
|
66
|
+
|
67
|
+
it "must accept a rotation angle" do
|
68
|
+
transformation = Transformation.new angle:90
|
69
|
+
transformation.identity?.wont_equal true
|
70
|
+
transformation.rotation.wont_be_nil
|
71
|
+
transformation.rotation.angle.must_equal 90
|
72
|
+
end
|
73
|
+
|
74
|
+
it "must accept a rotation angle specified by an X-axis" do
|
75
|
+
transformation = Transformation.new x:[0,1]
|
76
|
+
rotation = transformation.rotation
|
77
|
+
rotation.must_be_instance_of(RotationAngle)
|
78
|
+
rotation.angle.must_equal Math::PI/2
|
79
|
+
rotation.x.x.must_be_close_to 0
|
80
|
+
rotation.x.y.must_be_close_to 1
|
81
|
+
rotation.y.x.must_be_close_to -1
|
82
|
+
rotation.y.y.must_be_close_to 0
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe "comparison" do
|
88
|
+
subject { Transformation.new(origin:[1,2]) }
|
89
|
+
|
90
|
+
it "must equate equal transformations" do
|
91
|
+
subject.must_equal Transformation.new(origin:[1,2])
|
92
|
+
end
|
93
|
+
|
94
|
+
it "must not equal nil" do
|
95
|
+
subject.eql?(nil).wont_equal true
|
96
|
+
end
|
97
|
+
|
98
|
+
it "must not equate a translation with a rotation" do
|
99
|
+
subject.wont_equal Transformation.new(x:[0,1,0], y:[1,0,0])
|
100
|
+
end
|
101
|
+
|
102
|
+
it "must equate empty transformations" do
|
103
|
+
Transformation.new.must_equal Transformation.new
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
describe "attributes" do
|
108
|
+
describe "has_rotation?" do
|
109
|
+
it "must properly be true" do
|
110
|
+
Transformation.new(angle:90).has_rotation?.must_equal true
|
111
|
+
end
|
112
|
+
|
113
|
+
it "must properly be false" do
|
114
|
+
Transformation.new.has_rotation?.must_equal false
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
describe "composition" do
|
120
|
+
let(:translate_left) { Geometry::Transformation.new origin:[-2,-2] }
|
121
|
+
let(:translate_right) { Geometry::Transformation.new origin:[1,1] }
|
122
|
+
let(:transformation) { Geometry::Transformation.new }
|
123
|
+
|
124
|
+
it "must add pure translation" do
|
125
|
+
(translate_left + translate_right).must_equal Geometry::Transformation.new origin:[-1,-1]
|
126
|
+
end
|
127
|
+
|
128
|
+
it "must add translation and no translation" do
|
129
|
+
(transformation + translate_left).must_equal translate_left
|
130
|
+
(translate_left + transformation).must_equal translate_left
|
131
|
+
end
|
132
|
+
|
133
|
+
it "array addition" do
|
134
|
+
(transformation + [1,2]).translation.must_equal Point[1,2]
|
135
|
+
((transformation + [1,2]) + [2,3]).translation.must_equal Point[3,5]
|
136
|
+
(transformation + [1,2]).rotation.must_be_nil
|
137
|
+
end
|
138
|
+
|
139
|
+
it "must update the translation when an array is subtracted" do
|
140
|
+
(transformation - [1,2]).translation.must_equal Point[-1,-2]
|
141
|
+
((transformation - [1,2]) - [2,3]).translation.must_equal Point[-3,-5]
|
142
|
+
(transformation - [1,2,3]).rotation.must_be_nil
|
143
|
+
end
|
144
|
+
|
145
|
+
it "must subtract translation and no translation" do
|
146
|
+
(transformation - translate_left).must_equal translate_left
|
147
|
+
(translate_left - transformation).must_equal translate_left
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
describe "when transforming a Point" do
|
152
|
+
describe "when no transformation is set" do
|
153
|
+
it "must return the Point" do
|
154
|
+
Transformation.new.transform(Point[1,2]).must_equal Point[1,2];
|
155
|
+
end
|
156
|
+
end
|
157
|
+
|
158
|
+
it "must translate" do
|
159
|
+
Geometry::Transformation.new(origin:[0,1]).transform([1,0]).must_equal Point[1,1]
|
160
|
+
end
|
161
|
+
|
162
|
+
it "must rotate" do
|
163
|
+
rotated_point = Transformation.new(angle:Math::PI/2).transform([1,0])
|
164
|
+
rotated_point.x.must_be_close_to 0
|
165
|
+
rotated_point.y.must_be_close_to 1
|
166
|
+
end
|
167
|
+
|
168
|
+
end
|
169
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'geometry/triangle'
|
3
|
+
|
4
|
+
describe Geometry::Triangle do
|
5
|
+
Triangle = Geometry::Triangle
|
6
|
+
|
7
|
+
describe "when constructed with 3 points" do
|
8
|
+
let(:triangle) { Triangle.new [0,0], [0,1], [1,0] }
|
9
|
+
|
10
|
+
it "must create a scalene Triangle" do
|
11
|
+
triangle.must_be_instance_of Geometry::ScaleneTriangle
|
12
|
+
triangle.must_be_kind_of Triangle
|
13
|
+
end
|
14
|
+
|
15
|
+
it "must have a points accessor" do
|
16
|
+
triangle.points.must_equal [Point[0,0], Point[0,1], Point[1,0]]
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "when constructed with a point and a leg length" do
|
21
|
+
let(:triangle) { Triangle.new [0,0], 1 }
|
22
|
+
|
23
|
+
it "must create a right Triangle" do
|
24
|
+
triangle.must_be_instance_of Geometry::RightTriangle
|
25
|
+
triangle.must_be_kind_of(Triangle)
|
26
|
+
end
|
27
|
+
|
28
|
+
it "must have a points accessor" do
|
29
|
+
triangle.points.must_equal [Point[0,0], Point[0,1], Point[1,0]]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'minitest/autorun'
|
2
|
+
require 'geometry/vector'
|
3
|
+
|
4
|
+
describe Vector do
|
5
|
+
describe "when monkeypatching Vector" do
|
6
|
+
let(:left) { Vector[1,2] }
|
7
|
+
let(:right) { Vector[3,4] }
|
8
|
+
|
9
|
+
it "must have +@" do
|
10
|
+
(+left).must_equal Vector[1,2]
|
11
|
+
end
|
12
|
+
|
13
|
+
it "must have unary negation" do
|
14
|
+
(-left).must_equal Vector[-1,-2]
|
15
|
+
end
|
16
|
+
|
17
|
+
it "must cross product" do
|
18
|
+
left.cross(right).must_equal -2
|
19
|
+
Vector[1,2,3].cross(Vector[3,4,5]).must_equal Vector[-2, 4, -2]
|
20
|
+
(Vector[1,2,3] ** Vector[3,4,5]).must_equal Vector[-2, 4, -2]
|
21
|
+
end
|
22
|
+
|
23
|
+
it "must have a constant representing the X axis" do
|
24
|
+
Vector::X.must_equal Vector[1,0,0]
|
25
|
+
end
|
26
|
+
|
27
|
+
it "must have a constant representing the Y axis" do
|
28
|
+
Vector::Y.must_equal Vector[0,1,0]
|
29
|
+
end
|
30
|
+
|
31
|
+
it "must have a constant representing the Z axis" do
|
32
|
+
Vector::Z.must_equal Vector[0,0,1]
|
33
|
+
end
|
34
|
+
|
35
|
+
it "must not create global axis constants" do
|
36
|
+
-> { X }.must_raise NameError
|
37
|
+
-> { Y }.must_raise NameError
|
38
|
+
-> { Z }.must_raise NameError
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
data/test/geometry.rb
ADDED
metadata
ADDED
@@ -0,0 +1,117 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: geometry-in-ruby
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Brandon Fosdick
|
9
|
+
- Meseker Yohannes
|
10
|
+
autorequire:
|
11
|
+
bindir: bin
|
12
|
+
cert_chain: []
|
13
|
+
date: 2014-03-13 00:00:00.000000000 Z
|
14
|
+
dependencies: []
|
15
|
+
description: Geometric primitives and algorithms for Ruby
|
16
|
+
email:
|
17
|
+
- meseker.yohannes@gmail.com
|
18
|
+
executables: []
|
19
|
+
extensions: []
|
20
|
+
extra_rdoc_files: []
|
21
|
+
files:
|
22
|
+
- .gitignore
|
23
|
+
- Gemfile
|
24
|
+
- LICENSE
|
25
|
+
- README.markdown
|
26
|
+
- Rakefile
|
27
|
+
- geometry-in-ruby.gemspec
|
28
|
+
- lib/geometry.rb
|
29
|
+
- lib/geometry/arc.rb
|
30
|
+
- lib/geometry/circle.rb
|
31
|
+
- lib/geometry/cluster_factory.rb
|
32
|
+
- lib/geometry/edge.rb
|
33
|
+
- lib/geometry/line.rb
|
34
|
+
- lib/geometry/obround.rb
|
35
|
+
- lib/geometry/path.rb
|
36
|
+
- lib/geometry/point.rb
|
37
|
+
- lib/geometry/point_zero.rb
|
38
|
+
- lib/geometry/polygon.rb
|
39
|
+
- lib/geometry/polyline.rb
|
40
|
+
- lib/geometry/rectangle.rb
|
41
|
+
- lib/geometry/regular_polygon.rb
|
42
|
+
- lib/geometry/rotation.rb
|
43
|
+
- lib/geometry/size.rb
|
44
|
+
- lib/geometry/size_zero.rb
|
45
|
+
- lib/geometry/square.rb
|
46
|
+
- lib/geometry/text.rb
|
47
|
+
- lib/geometry/transformation.rb
|
48
|
+
- lib/geometry/transformation/composition.rb
|
49
|
+
- lib/geometry/triangle.rb
|
50
|
+
- lib/geometry/vector.rb
|
51
|
+
- test/geometry.rb
|
52
|
+
- test/geometry/arc.rb
|
53
|
+
- test/geometry/circle.rb
|
54
|
+
- test/geometry/edge.rb
|
55
|
+
- test/geometry/line.rb
|
56
|
+
- test/geometry/obround.rb
|
57
|
+
- test/geometry/path.rb
|
58
|
+
- test/geometry/point.rb
|
59
|
+
- test/geometry/point_zero.rb
|
60
|
+
- test/geometry/polygon.rb
|
61
|
+
- test/geometry/polyline.rb
|
62
|
+
- test/geometry/rectangle.rb
|
63
|
+
- test/geometry/regular_polygon.rb
|
64
|
+
- test/geometry/rotation.rb
|
65
|
+
- test/geometry/size.rb
|
66
|
+
- test/geometry/size_zero.rb
|
67
|
+
- test/geometry/square.rb
|
68
|
+
- test/geometry/transformation.rb
|
69
|
+
- test/geometry/transformation/composition.rb
|
70
|
+
- test/geometry/triangle.rb
|
71
|
+
- test/geometry/vector.rb
|
72
|
+
homepage: http://github.com/meseker/geometry
|
73
|
+
licenses: []
|
74
|
+
post_install_message:
|
75
|
+
rdoc_options: []
|
76
|
+
require_paths:
|
77
|
+
- lib
|
78
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
79
|
+
none: false
|
80
|
+
requirements:
|
81
|
+
- - ! '>='
|
82
|
+
- !ruby/object:Gem::Version
|
83
|
+
version: '0'
|
84
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
85
|
+
none: false
|
86
|
+
requirements:
|
87
|
+
- - ! '>='
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
requirements: []
|
91
|
+
rubyforge_project: aurora_geometry
|
92
|
+
rubygems_version: 1.8.23
|
93
|
+
signing_key:
|
94
|
+
specification_version: 3
|
95
|
+
summary: Geometric primitives and algoritms
|
96
|
+
test_files:
|
97
|
+
- test/geometry.rb
|
98
|
+
- test/geometry/arc.rb
|
99
|
+
- test/geometry/circle.rb
|
100
|
+
- test/geometry/edge.rb
|
101
|
+
- test/geometry/line.rb
|
102
|
+
- test/geometry/obround.rb
|
103
|
+
- test/geometry/path.rb
|
104
|
+
- test/geometry/point.rb
|
105
|
+
- test/geometry/point_zero.rb
|
106
|
+
- test/geometry/polygon.rb
|
107
|
+
- test/geometry/polyline.rb
|
108
|
+
- test/geometry/rectangle.rb
|
109
|
+
- test/geometry/regular_polygon.rb
|
110
|
+
- test/geometry/rotation.rb
|
111
|
+
- test/geometry/size.rb
|
112
|
+
- test/geometry/size_zero.rb
|
113
|
+
- test/geometry/square.rb
|
114
|
+
- test/geometry/transformation.rb
|
115
|
+
- test/geometry/transformation/composition.rb
|
116
|
+
- test/geometry/triangle.rb
|
117
|
+
- test/geometry/vector.rb
|