geometry-in-ruby 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. data/.gitignore +6 -0
  2. data/Gemfile +7 -0
  3. data/LICENSE +21 -0
  4. data/README.markdown +105 -0
  5. data/Rakefile +24 -0
  6. data/geometry-in-ruby.gemspec +23 -0
  7. data/lib/geometry/arc.rb +94 -0
  8. data/lib/geometry/circle.rb +122 -0
  9. data/lib/geometry/cluster_factory.rb +15 -0
  10. data/lib/geometry/edge.rb +140 -0
  11. data/lib/geometry/line.rb +154 -0
  12. data/lib/geometry/obround.rb +238 -0
  13. data/lib/geometry/path.rb +67 -0
  14. data/lib/geometry/point.rb +163 -0
  15. data/lib/geometry/point_zero.rb +107 -0
  16. data/lib/geometry/polygon.rb +368 -0
  17. data/lib/geometry/polyline.rb +318 -0
  18. data/lib/geometry/rectangle.rb +378 -0
  19. data/lib/geometry/regular_polygon.rb +136 -0
  20. data/lib/geometry/rotation.rb +190 -0
  21. data/lib/geometry/size.rb +75 -0
  22. data/lib/geometry/size_zero.rb +70 -0
  23. data/lib/geometry/square.rb +113 -0
  24. data/lib/geometry/text.rb +24 -0
  25. data/lib/geometry/transformation/composition.rb +39 -0
  26. data/lib/geometry/transformation.rb +171 -0
  27. data/lib/geometry/triangle.rb +78 -0
  28. data/lib/geometry/vector.rb +34 -0
  29. data/lib/geometry.rb +22 -0
  30. data/test/geometry/arc.rb +25 -0
  31. data/test/geometry/circle.rb +112 -0
  32. data/test/geometry/edge.rb +132 -0
  33. data/test/geometry/line.rb +132 -0
  34. data/test/geometry/obround.rb +25 -0
  35. data/test/geometry/path.rb +66 -0
  36. data/test/geometry/point.rb +258 -0
  37. data/test/geometry/point_zero.rb +177 -0
  38. data/test/geometry/polygon.rb +214 -0
  39. data/test/geometry/polyline.rb +266 -0
  40. data/test/geometry/rectangle.rb +154 -0
  41. data/test/geometry/regular_polygon.rb +120 -0
  42. data/test/geometry/rotation.rb +108 -0
  43. data/test/geometry/size.rb +97 -0
  44. data/test/geometry/size_zero.rb +153 -0
  45. data/test/geometry/square.rb +66 -0
  46. data/test/geometry/transformation/composition.rb +49 -0
  47. data/test/geometry/transformation.rb +169 -0
  48. data/test/geometry/triangle.rb +32 -0
  49. data/test/geometry/vector.rb +41 -0
  50. data/test/geometry.rb +5 -0
  51. 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
@@ -0,0 +1,5 @@
1
+ require 'minitest/autorun'
2
+ require 'geometry'
3
+
4
+ describe Geometry do
5
+ end
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