#!/usr/bin/perl use strict; use warnings; use lib 'lib'; use Physics::Springs::Friction; my $sim = Physics::Springs::Friction->new(); my $p1 = $sim->add_particle( x => -2, y => -1.5, z => 0, vx => 0, vy => 0.04, vz => 0, m => 5, n => 'Particle1', ); my $p2 = $sim->add_particle( x => 0, y => -1.5, z => 0, vx => 0, vy => 0.04, vz => 0, m => 5, n => 'Particle2', ); $sim->add_spring(k => 0.25, p1 => $p1, p2 => $p2, l => 1 ); $sim->add_friction('stokes', .05); my $iterations = 25000; # Make this >5000 to get a reasonable picture. 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(0.02); } # Only plotting done below. Uncomment for a picture. 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; 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 => 200, ); $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..1) { $plotter->plot_range( color => $color[$_], params => [ [$_], [0, $iterations-1, 5], ], type => 'line', ); } $img->write(file=>'t.png') or die $img->errstr;