vector_geometry 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.
@@ -0,0 +1,2 @@
1
+ # This file is copied to spec/ when you run 'rails generate rspec:install'
2
+ require File.expand_path("../../lib/vector_geometry", __FILE__)
@@ -0,0 +1,274 @@
1
+ require 'spec_helper'
2
+
3
+ include Geometry
4
+
5
+ describe Vector do
6
+
7
+ context "initialization" do
8
+
9
+ it ".new constructor should initialize Vector object" do
10
+ vector = Vector.new(4,5)
11
+ vector.should be_a Geometry::Vector
12
+ end
13
+
14
+ end
15
+
16
+ context "instance variables" do
17
+
18
+ it "should have x and y values" do
19
+ vector = Vector.new(4,5)
20
+
21
+ vector.x.should eql 4.0
22
+ vector.y.should eql 5.0
23
+ end
24
+
25
+ it "should not have a z values" do
26
+ vector = Vector.new(4,5)
27
+
28
+ vector.z.should eql 0.0
29
+ end
30
+
31
+ it "should have x, y and z values" do
32
+ vector = Vector.new(4,5,2)
33
+
34
+ vector.x.should eql 4.0
35
+ vector.y.should eql 5.0
36
+ vector.z.should eql 2.0
37
+ end
38
+
39
+ end
40
+
41
+ context "adding" do
42
+
43
+ it "should add two 2D vectors" do
44
+ vector_1 = Vector.new(2,2)
45
+ vector_2 = Vector.new(2,3)
46
+
47
+ vector_3 = vector_1 + vector_2
48
+
49
+ vector_3.x.should eql 4.0
50
+ vector_3.y.should eql 5.0
51
+ end
52
+
53
+ it "should add two 3D vectors" do
54
+ vector_1 = Vector.new(2,2,1)
55
+ vector_2 = Vector.new(2,3,10)
56
+
57
+ vector_3 = vector_1 + vector_2
58
+
59
+ vector_3.x.should eql 4.0
60
+ vector_3.y.should eql 5.0
61
+ vector_3.z.should eql 11.0
62
+ end
63
+
64
+ end
65
+
66
+ context "subtracting" do
67
+
68
+ it "should subtract two 2D vectors" do
69
+ vector_1 = Vector.new(2,2)
70
+ vector_2 = Vector.new(2,3)
71
+
72
+ vector_3 = vector_1 - vector_2
73
+
74
+ vector_3.x.should eql 0.0
75
+ vector_3.y.should eql -1.0
76
+ end
77
+
78
+ it "should subtract two 3D vectors" do
79
+ vector_1 = Vector.new(2,2,1)
80
+ vector_2 = Vector.new(2,3,10)
81
+
82
+ vector_3 = vector_1 - vector_2
83
+ vector_3.x.should eql 0.0
84
+ vector_3.y.should eql -1.0
85
+ vector_3.z.should eql -9.0
86
+ end
87
+
88
+ end
89
+
90
+ context "multiplying" do
91
+
92
+ it "should multiply a 2D vector by a scalar" do
93
+ vector_1 = Vector.new(2,2)
94
+
95
+ vector_2 = vector_1 * 4
96
+ vector_2.x.should eql 8.0
97
+ vector_2.y.should eql 8.0
98
+ end
99
+
100
+ it "should multiply a 3D vector by a scalar" do
101
+ vector_1 = Vector.new(2,2,10)
102
+
103
+ vector_2 = vector_1 * 4
104
+ vector_2.x.should eql 8.0
105
+ vector_2.y.should eql 8.0
106
+ vector_2.z.should eql 40.0
107
+ end
108
+
109
+ end
110
+
111
+ context "dividing" do
112
+
113
+ it "should divide a 2D vector by a scalar" do
114
+ vector_1 = Vector.new(2,2)
115
+
116
+ vector_2 = vector_1 / 4
117
+ vector_2.x.should eql 0.5
118
+ vector_2.y.should eql 0.5
119
+ end
120
+
121
+ it "should divide a 3D vector by a scalar" do
122
+ vector_1 = Vector.new(2,2,10)
123
+
124
+ vector_2 = vector_1 / 4
125
+ vector_2.x.should eql 0.5
126
+ vector_2.y.should eql 0.5
127
+ vector_2.z.should eql 2.5
128
+ end
129
+
130
+ end
131
+
132
+ context "magnitude" do
133
+
134
+ it "should calculate the magnitude of a 2D vector" do
135
+ vector = Vector.new(3,4)
136
+
137
+ vector.r.should be_within(0.1).of(5)
138
+ end
139
+
140
+ it "should calculate the magnitude of a 3D vector" do
141
+ vector = Vector.new(3,4,5)
142
+
143
+ vector.r.should be_within(0.1).of(7.0)
144
+ end
145
+
146
+ end
147
+
148
+ context "normalize" do
149
+
150
+ it "should normalize a 2D vector" do
151
+ vector = Vector.new(3,4)
152
+
153
+ unit_vector = vector.normalize
154
+
155
+ unit_vector.x.should be_within(0.01).of(0.6)
156
+ unit_vector.y.should be_within(0.01).of(0.8)
157
+
158
+ unit_vector.r.round(1).should eql 1.0
159
+ end
160
+
161
+ it "should normalize a 3D vector" do
162
+ vector = Vector.new(3,4,5)
163
+
164
+ unit_vector = vector.normalize
165
+
166
+ unit_vector.x.should be_within(0.05).of(0.42)
167
+ unit_vector.y.should be_within(0.05).of(0.56)
168
+ unit_vector.z.should be_within(0.05).of(0.70)
169
+
170
+ unit_vector.r.round(1).should eql 1.0
171
+ end
172
+
173
+ end
174
+
175
+ context "heading" do
176
+
177
+ it "should calculate heading of a 2D vector" do
178
+ vector = Vector.new(3,4)
179
+
180
+ vector.heading.should be_within(0.1).of(0.9)
181
+ end
182
+
183
+ end
184
+
185
+ context "dot product" do
186
+
187
+ it "should return the dot product of 2D vector" do
188
+ vector_1 = Vector.new(5,0)
189
+ vector_2 = Vector.new(5,5)
190
+
191
+ dot = vector_1.dot(vector_2)
192
+
193
+ dot.should eql 25.0
194
+
195
+ # Compare two ways of calculating dot product
196
+ dot.should be_within(0.0001).of(vector_1.r * vector_2.r * Math.cos(vector_1.angle(vector_2)))
197
+ end
198
+
199
+ it "should return the dot product of 3D vector" do
200
+ vector_1 = Vector.new(5,0,8)
201
+ vector_2 = Vector.new(5,5,3)
202
+
203
+ dot = vector_1.dot(vector_2)
204
+
205
+ dot.should eql 49.0
206
+
207
+ # Compare two ways of calculating dot product
208
+ dot.should be_within(0.1).of(vector_1.r * vector_2.r * Math.cos(vector_1.angle(vector_2)))
209
+ end
210
+
211
+ end
212
+
213
+ context "distance from line" do
214
+
215
+ before do
216
+ @line_start = Vector.new(0,0)
217
+ @line_end = Vector.new(5,5)
218
+ end
219
+
220
+ it "should calculate a distance within shadow of line" do
221
+ point = Vector.new(5,0)
222
+ point.distance_from_line(@line_start,@line_end).should be_within(0.1).of(3.5)
223
+
224
+ point = Vector.new(0,1)
225
+ point.distance_from_line(@line_start,@line_end).should be_within(0.1).of(0.707)
226
+
227
+ end
228
+
229
+ it "should calculate a distance if beyond end point" do
230
+ point = Vector.new(6,5)
231
+
232
+ point.distance_from_line(@line_start,@line_end).should be_within(0.001).of(0.707106)
233
+ end
234
+
235
+ it "should calculate a distance if beyond start point" do
236
+ point = Vector.new(-1,1)
237
+
238
+ point.distance_from_line(@line_start,@line_end).should be_within(0.001).of(1.4142)
239
+ end
240
+
241
+ end
242
+
243
+ context "distance from line segment" do
244
+
245
+ before do
246
+ @line_start = Vector.new(0,0)
247
+ @line_end = Vector.new(5,5)
248
+ end
249
+
250
+ it "should calculate a distance within shadow of line" do
251
+ point = Vector.new(5,0)
252
+ point.distance_from_line_segment(@line_start,@line_end).should be_within(0.1).of(3.5)
253
+
254
+ point = Vector.new(0,1)
255
+ point.distance_from_line_segment(@line_start,@line_end).should be_within(0.1).of(0.707)
256
+
257
+ end
258
+
259
+ it "should calculate a distance if beyond end point" do
260
+ point = Vector.new(6,5)
261
+
262
+ point.distance_from_line_segment(@line_start,@line_end).should be_within(0.001).of(1.0)
263
+ end
264
+
265
+ it "should calculate a distance if beyond start point" do
266
+ point = Vector.new(-1,1)
267
+
268
+ point.distance_from_line_segment(@line_start,@line_end).should be_within(0.001).of(1.4142)
269
+ end
270
+
271
+ end
272
+
273
+ end
274
+
@@ -0,0 +1,61 @@
1
+ # Generated by jeweler
2
+ # DO NOT EDIT THIS FILE DIRECTLY
3
+ # Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
4
+ # -*- encoding: utf-8 -*-
5
+
6
+ Gem::Specification.new do |s|
7
+ s.name = "vector_geometry"
8
+ s.version = "0.0.1"
9
+
10
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
+ s.authors = ["Andrew Berkeley"]
12
+ s.date = "2013-06-03"
13
+ s.description = "Cartesian and spherical geometry using vectors"
14
+ s.email = "andrew.berkeley.is@googlemail.com"
15
+ s.extra_rdoc_files = [
16
+ "README.md"
17
+ ]
18
+ s.files = [
19
+ "COPYING",
20
+ "Gemfile",
21
+ "README.md",
22
+ "Rakefile",
23
+ "VERSION",
24
+ "lib/geometry/geometry.rb",
25
+ "lib/geometry/spheroid/base.rb",
26
+ "lib/geometry/spheroid/sphere.rb",
27
+ "lib/geometry/vector/earth_vector.rb",
28
+ "lib/geometry/vector/geo_vector.rb",
29
+ "lib/geometry/vector/vector.rb",
30
+ "lib/vector_geometry.rb",
31
+ "spec/exercises_spec.rb",
32
+ "spec/geo_vector_spec.rb",
33
+ "spec/spec_helper.rb",
34
+ "spec/vector_spec.rb",
35
+ "vector_geometry.gemspec"
36
+ ]
37
+ s.homepage = "https://github.com/spatchcock/vector_geometry"
38
+ s.licenses = ["GNU Affero General Public License"]
39
+ s.require_paths = ["lib"]
40
+ s.rubygems_version = "1.8.24"
41
+ s.summary = "Cartesian and spherical geometry using vectors"
42
+
43
+ if s.respond_to? :specification_version then
44
+ s.specification_version = 3
45
+
46
+ if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
47
+ s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
48
+ s.add_development_dependency(%q<rspec>, ["~> 2.6.0"])
49
+ s.add_development_dependency(%q<rdoc>, [">= 0"])
50
+ else
51
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
52
+ s.add_dependency(%q<rspec>, ["~> 2.6.0"])
53
+ s.add_dependency(%q<rdoc>, [">= 0"])
54
+ end
55
+ else
56
+ s.add_dependency(%q<jeweler>, ["~> 1.6.4"])
57
+ s.add_dependency(%q<rspec>, ["~> 2.6.0"])
58
+ s.add_dependency(%q<rdoc>, [">= 0"])
59
+ end
60
+ end
61
+
metadata ADDED
@@ -0,0 +1,114 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: vector_geometry
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Andrew Berkeley
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-06-03 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: jeweler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: 1.6.4
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: 1.6.4
30
+ - !ruby/object:Gem::Dependency
31
+ name: rspec
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ~>
36
+ - !ruby/object:Gem::Version
37
+ version: 2.6.0
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ~>
44
+ - !ruby/object:Gem::Version
45
+ version: 2.6.0
46
+ - !ruby/object:Gem::Dependency
47
+ name: rdoc
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :development
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ description: Cartesian and spherical geometry using vectors
63
+ email: andrew.berkeley.is@googlemail.com
64
+ executables: []
65
+ extensions: []
66
+ extra_rdoc_files:
67
+ - README.md
68
+ files:
69
+ - COPYING
70
+ - Gemfile
71
+ - README.md
72
+ - Rakefile
73
+ - VERSION
74
+ - lib/geometry/geometry.rb
75
+ - lib/geometry/spheroid/base.rb
76
+ - lib/geometry/spheroid/sphere.rb
77
+ - lib/geometry/vector/earth_vector.rb
78
+ - lib/geometry/vector/geo_vector.rb
79
+ - lib/geometry/vector/vector.rb
80
+ - lib/vector_geometry.rb
81
+ - spec/exercises_spec.rb
82
+ - spec/geo_vector_spec.rb
83
+ - spec/spec_helper.rb
84
+ - spec/vector_spec.rb
85
+ - vector_geometry.gemspec
86
+ homepage: https://github.com/spatchcock/vector_geometry
87
+ licenses:
88
+ - GNU Affero General Public License
89
+ post_install_message:
90
+ rdoc_options: []
91
+ require_paths:
92
+ - lib
93
+ required_ruby_version: !ruby/object:Gem::Requirement
94
+ none: false
95
+ requirements:
96
+ - - ! '>='
97
+ - !ruby/object:Gem::Version
98
+ version: '0'
99
+ segments:
100
+ - 0
101
+ hash: 555415684442903922
102
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
+ none: false
104
+ requirements:
105
+ - - ! '>='
106
+ - !ruby/object:Gem::Version
107
+ version: '0'
108
+ requirements: []
109
+ rubyforge_project:
110
+ rubygems_version: 1.8.24
111
+ signing_key:
112
+ specification_version: 3
113
+ summary: Cartesian and spherical geometry using vectors
114
+ test_files: []