# Before `make install' is performed this script should be runnable with
# `make test'. After `make install' it should work as `perl test.pl'
#########################
use strict;
use warnings;
use Test::More tests => 3;
use lib 'lib';
use Physics::Particles;
ok(1, "Module loaded."); # If we made it this far, we're ok.
#########################
use constant G => 6.67e-11;
use constant MEARTH => 5.972E24;
use constant AU => 149597870691;
use constant DAY => 60*60*24;
my $sim = Physics::Particles->new();
ok(ref $sim eq 'Physics::Particles', "Simulator created.");
$sim->add_force(
sub {
my $p = shift;
my $excerter = shift;
my $params = shift;
my $time_diff = $params->[0];
my $x_dist = ($excerter->{x} - $p->{x});
my $y_dist = ($excerter->{y} - $p->{y});
my $z_dist = ($excerter->{z} - $p->{z});
my $dist = sqrt($x_dist**2 + $y_dist**2 + $z_dist**2);
# force = m1*m2*unit_vector_from_r1_to_r2/distance**2
# a = f/m1 (module does that for us)
my $const = (((G * MEARTH) / AU) / AU);
my $force =
(
$dist == 0 ? 0 :
$const * $p->{m} * $excerter->{m} / $dist**3
#const = (G * MEARTH / AU / AU)
);
return(
$force * $x_dist,
$force * $y_dist,
$force * $z_dist,
);
},
1 # symmetric force
);
ok(1, "add_force did not croak.");
$sim->add_particle(
x => -0.001541580,
y => -0.005157481,
z => -0.002146907,
vx => 0.000008555,
vy => 0.000000341,
vz => -0.000000084,
m => 333054.25,
n => 'sun',
);
$sim->add_particle(
x => 0.352233521,
y => -0.117718043,
z => -0.098961836,
vx => 0.004046276,
vy => 0.024697922,
vz => 0.0127737,
m => 0.05525787,
n => 'mercury',
);
$sim->add_particle(
x => 0.033968222,
y => -0.666660228,
z => -0.301998971,
vx => 0.020058354,
vy => 0.001549021,
vz => -0.00057222,
m => 0.8153047,
n => 'venus',
);
$sim->add_particle(
x => -0.178474939,
y => 0.882278285,
z => 0.382595849,
vx => -0.017160761,
vy => -0.003032468,
vz => -0.001315514,
m => 1,
n => 'earth',
);
$sim->add_particle(
x => -0.179738396,
y => 0.884150219,
z => 0.383544671,
vx => -0.017640031,
vy => -0.003408191,
vz => -0.001432299,
m => 0.01230743,
n => 'moon',
);
$sim->add_particle(
x => 1.277891009,
y => 0.577739792,
z => 0.230622826,
vx => -0.005679889,
vy => 0.012423137,
vz => 0.005851583,
m => 0.10753348,
n => 'mars',
);
ok(1, "add_particle did not croak.");
my $iterations = 1000;
my @pos = ([],[],[],[],[],[]);
foreach (1..$iterations) {
my $p_no = 0;
foreach my $p (@{ $sim->{p} }) {
push @{$pos[$p_no]}, [ $p->{x}, $p->{y}, $p->{z} ];
$p_no++;
}
$sim->iterate_step(1);
}
use Math::Project3D::Plot;
my $img = Imager->new(xsize=>1024,ysize=>768);
my $proj = Math::Project3D->new(
plane_basis_vector => [ 0, 0, 0 ],
plane_direction1 => [ 0.371391, 0.928477, 0 ],
plane_direction2 => [ 0.371391, 0, 0.928477 ],
);
$proj->new_function(
sub { $pos[$_[0]][$_[1]][0] },
sub { $pos[$_[0]][$_[1]][1] },
sub { $pos[$_[0]][$_[1]][2] },
);
my @color;
#my $col = 0;
#foreach (1..6) {
# push @color, Imager::Color->new($col, $col*($_ % 2), 0);
# $col += 50;
#}
push @color, Imager::Color->new( 255, 255, 0 ); # sun
push @color, Imager::Color->new( 0, 255, 0 ); # mercury
push @color, Imager::Color->new( 255, 0, 255 ); # venus
push @color, Imager::Color->new( 0, 0, 255 ); # earth
push @color, Imager::Color->new( 255, 255, 255 ); # moon
push @color, Imager::Color->new( 255, 0, 0 ); # mars
my $x_axis = Imager::Color->new(40, 40, 40);
my $y_axis = Imager::Color->new(40, 40, 40);
my $z_axis = Imager::Color->new(40, 40, 40);
my $background = Imager::Color->new(0, 0, 0);
$img->flood_fill(x=>0,y=>0,color=>$background);
my $plotter = Math::Project3D::Plot->new(
image => $img,
projection => $proj,
scale => 400,
);
$plotter->plot_axis( # x axis
vector => [1, 0, 0],
color => $x_axis,
length => 100,
);
$plotter->plot_axis( # y axis
vector => [0, 1, 0],
color => $y_axis,
length => 100,
);
$plotter->plot_axis( # z axis
vector => [0, 0, 1],
color => $z_axis,
length => 100,
);
foreach (0..5) {
$plotter->plot_range(
color => $color[$_],
params => [
[$_],
[0, $iterations-1, 1],
],
type => 'line',
);
}
$img->write(file=>'t.png') or
die $img->errstr;