use constant X => 0; use constant Y => 1; my @points1 = ( [1,1], [2,2], [3,3] ); # a line like / my @points2 = ( [2,1], [3,2], [4,3] ); # a line like / displaced R my @points3 = ( [1,1], [2.41,1], [3.82,1]);# a line like - my @template = ( [1,3], [2,2], [3,1] ); # a line like \ my $vp1 = vector(\@points1,2); my $vp2 = vector(\@points2,2); my $vp3 = vector(\@points3,2); my $vt = vector(\@template,2); print "@$vp1\n@$vp2\n@$vp3\ntemplate\n@$vt\n"; sub vector { my ($points, $precision) = @_; $precision ||= 10; # calculate the geometric centroid my ( $cx, $cy ) = (0,0); for (@$points) { $cx += $_->[X]; $cy += $_->[Y]; } $cx /= @$points; $cy /= @$points; # map the 1 dimensional distance of all points from centroid # using simple pythagorean geometry my @vector = map{ sqrt(($cx-$_->[X])**2 + ($cy-$_->[Y])**2) } @$points; # fuzzify to desired precision and sort to create finished vector my $template = "%.${precision}f"; @vector = map{ sprintf $template, $_ } sort { $a <=> $b } @vector; return \@vector; } __DATA__ 0.00 1.41 1.41 0.00 1.41 1.41 0.00 1.41 1.41 template 0.00 1.41 1.41