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.
- data/COPYING +20 -0
- data/Gemfile +9 -0
- data/README.md +153 -0
- data/Rakefile +47 -0
- data/VERSION +1 -0
- data/lib/geometry/geometry.rb +47 -0
- data/lib/geometry/spheroid/base.rb +106 -0
- data/lib/geometry/spheroid/sphere.rb +29 -0
- data/lib/geometry/vector/earth_vector.rb +7 -0
- data/lib/geometry/vector/geo_vector.rb +234 -0
- data/lib/geometry/vector/vector.rb +223 -0
- data/lib/vector_geometry.rb +6 -0
- data/spec/exercises_spec.rb +210 -0
- data/spec/geo_vector_spec.rb +38 -0
- data/spec/spec_helper.rb +2 -0
- data/spec/vector_spec.rb +274 -0
- data/vector_geometry.gemspec +61 -0
- metadata +114 -0
data/spec/spec_helper.rb
ADDED
data/spec/vector_spec.rb
ADDED
@@ -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: []
|