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.
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