orbiter 0.0.2
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.
- checksums.yaml +7 -0
- data/lib/free_body.rb +17 -0
- data/lib/orbit_helper.rb +2 -0
- data/lib/orbit_updater.rb +50 -0
- data/lib/orbiter.rb +27 -0
- metadata +47 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 0ff7911d0476677d3acb652adbe1d4723fa61199
|
4
|
+
data.tar.gz: f4a056a95ff34c1ccaf12796c2a719cee4e6a4ea
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 1ab6aa144eb18f4a5a95c1f48d2984e14e6174c41bde0a9691ccc77b84f977275af662e83946895eaa032994e647f8b2ca6ccf8af5caa7506f47b118a596d1a2
|
7
|
+
data.tar.gz: 5fbebd1b4434c79dfd959f9837592f4e4f3ea43b169d8e0a25ca3ce9583434183acbb18ba50dfb6f55492357214b292a42d037813fe40850f32cb30f195376ce
|
data/lib/free_body.rb
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
module Orbiter
|
2
|
+
class Free_body
|
3
|
+
attr_accessor :mass, :x, :y, :vel_x, :vel_y, :acc_x, :acc_y, :old_acc_x, :old_acc_y
|
4
|
+
|
5
|
+
def initialize(attrs = {})
|
6
|
+
@mass = attrs.fetch(:mass, 10)
|
7
|
+
@x = attrs.fetch(:x, 0)
|
8
|
+
@y = attrs.fetch(:y, 0)
|
9
|
+
@vel_x = attrs.fetch(:vel_x, 0)
|
10
|
+
@vel_y = attrs.fetch(:vel_y, 0)
|
11
|
+
@acc_x = attrs.fetch(:acc_x, 0)
|
12
|
+
@acc_y = attrs.fetch(:acc_y, 0)
|
13
|
+
@old_acc_x = attrs.fetch(:old_acc_x, 0)
|
14
|
+
@old_acc_y = attrs.fetch(:old_acc_y, 0)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/orbit_helper.rb
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
module Orbiter
|
2
|
+
class Orbit_updater
|
3
|
+
|
4
|
+
#Changing these breaks tests, which expect both to = 1
|
5
|
+
G_CONSTANT = 1
|
6
|
+
TIME_CONSTANT = 1
|
7
|
+
|
8
|
+
def self.calc_dist(body_a, body_b)
|
9
|
+
Math.sqrt( (body_a.x - body_b.x)**2 + (body_a.y - body_b.y)**2 )
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.calc_grav_acc(target, other_bodies)
|
13
|
+
target.old_acc_x = target.acc_x
|
14
|
+
target.old_acc_y = target.acc_y
|
15
|
+
target.acc_x = 0.0
|
16
|
+
target.acc_y = 0.0
|
17
|
+
other_bodies.each do |other_body|
|
18
|
+
if (dist = calc_dist(target, other_body)) > 0
|
19
|
+
acc = G_CONSTANT*other_body.mass / (dist ** 2)
|
20
|
+
target.acc_x += acc * Math.cos(calc_angle(target, other_body))
|
21
|
+
target.acc_y += acc * Math.sin(calc_angle(target, other_body))
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.calc_angle(body_a, body_b)
|
27
|
+
y_diff = body_b.y - body_a.y
|
28
|
+
x_diff = body_b.x - body_a.x
|
29
|
+
Math.atan2(y_diff, x_diff)
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.update_velocity(target)
|
33
|
+
#binding.pry
|
34
|
+
target.vel_x += TIME_CONSTANT * (target.old_acc_x + target.acc_x ) / 2
|
35
|
+
target.vel_y += TIME_CONSTANT * (target.old_acc_y + target.acc_y ) / 2
|
36
|
+
end
|
37
|
+
|
38
|
+
def self.update_position(target)
|
39
|
+
target.x += TIME_CONSTANT * ( target.vel_x + TIME_CONSTANT * target.acc_x / 2 )
|
40
|
+
target.y += TIME_CONSTANT * ( target.vel_y + TIME_CONSTANT * target.acc_y / 2 )
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.track(file, bodies)
|
44
|
+
bodies.each do |body|
|
45
|
+
file.print("#{body.x}\t#{body.y}\t")
|
46
|
+
end
|
47
|
+
file.puts()
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
data/lib/orbiter.rb
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
require_relative 'orbit_helper.rb'
|
2
|
+
|
3
|
+
module Orbiter
|
4
|
+
|
5
|
+
class Orbit_runner
|
6
|
+
|
7
|
+
def self.run(attrs = {})
|
8
|
+
@bodies = attrs.fetch(:bodies, [Orbiter::Free_body.new(mass: 10, x: 100, y: 100, vel_x: -5, vel_y: -1),
|
9
|
+
Orbiter::Free_body.new(mass:1000)])
|
10
|
+
@output = attrs[:output] ? File.open(attrs[:output], 'w') : $stdout
|
11
|
+
|
12
|
+
100.times do
|
13
|
+
@bodies.each do |body|
|
14
|
+
Orbiter::Orbit_updater.calc_grav_acc(body, @bodies)
|
15
|
+
Orbiter::Orbit_updater.update_position(body)
|
16
|
+
Orbiter::Orbit_updater.calc_grav_acc(body, @bodies)
|
17
|
+
Orbiter::Orbit_updater.update_velocity(body)
|
18
|
+
end
|
19
|
+
Orbiter::Orbit_updater.track(@output, @bodies)
|
20
|
+
end
|
21
|
+
|
22
|
+
@output.close
|
23
|
+
|
24
|
+
puts "Thanks for running!"
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
metadata
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: orbiter
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Will Weiss
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-02-25 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description:
|
14
|
+
email: wweiss00@gmail.com
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- lib/orbiter.rb
|
20
|
+
- lib/free_body.rb
|
21
|
+
- lib/orbit_helper.rb
|
22
|
+
- lib/orbit_updater.rb
|
23
|
+
homepage:
|
24
|
+
licenses:
|
25
|
+
- MIT
|
26
|
+
metadata: {}
|
27
|
+
post_install_message:
|
28
|
+
rdoc_options: []
|
29
|
+
require_paths:
|
30
|
+
- lib
|
31
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - '>='
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '0'
|
36
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
requirements: []
|
42
|
+
rubyforge_project:
|
43
|
+
rubygems_version: 2.0.7
|
44
|
+
signing_key:
|
45
|
+
specification_version: 4
|
46
|
+
summary: For tracking the orbits of n free bodies in a 2D space
|
47
|
+
test_files: []
|