我正在尝试计算同一区域中一组坐标之间的距离。使用类型[[distance = sqrt(x2-x1)^ 2 +(y2-y1)^ 2)。我知道我已经快要实现了,但是我以某种方式堆叠了起来,所以我需要一些帮助。这是我写的:
use strict;
use warnings;
use feature 'say';
use Data::Dumper;
use POSIX; #gia dekadikous se akairaious
my$x=0;
my$y=0;
my$i=0;
my $flag = 1;
my @temp; #gia na kratisei tin loopa. an den isxei shmainei oti den exoume pinaka
my @proigoumeno;
my @dis;
my @row;
#my $counter=0;
my$final;
my $filename = 'myfile.txt';
open(my $fh, '<:encoding(UTF-8)', $filename)
or die "Could not open file '$filename' $!";
while(<$fh>) {
@temp = split ' ';
if( $flag ) {
@proigoumeno = @temp;
$flag = 0;
next;
}
if( $#temp != $#proigoumeno ) {
} else {
my @data = map {(($proigoumeno[$_]-$temp[$_])) } 0..$#temp;
push my@dis, \@data;
foreach $row(@dis){
my$x = $row [$i] ;
my$y = $row [$i+1];
my$final = sqrt(($x**2)+($y**2));
my$ceil=ceil(my$final;)
#my$counter =my$counter+1;
say join ' ',$ceil;
}
}
}
我的输入文件是这样的:
area1 73070 74098 stop area1 79689 79934 stop area2 57000 59336 signal area2 69391 72882 signal area3 65205 66473 triangle area3 66888 68294 triangle area4 44491 48216 block area4 269762 273388 block area5 390882 392312 signal area5 85172 85501 signal
所以我想要的输出是这样的:
area1 DISTANCE stop area2 DISTANCE signal area3 DISTANCE triangle area4 DISTANCE block area5 DISTANCE signal
其中DISTANCE = sqrt(第二列的第二行-第二列的第一行^ 2 +第三列的第二行-第二列的第一行^ 2)。我要打印文件的第一列以及坐标计算后的第四列。因为我的水平不足以执行我想要的操作,所以只能在开始时使用计数器来打印第一列,然后像这样进行打印“ say join'area,$ counter'”,或使用在我的输出文件中使用命令行| paste添加这些列。但是在代码内部,我不知道该怎么做,所以如果有人可以在这方面提供帮助,我将非常感激。b)最初,我仅通过对两列进行减法来测试我的代码,并且可以正常工作,但是当我尝试在foreach循环中添加sqrt时,我搞砸了关于我想要的输出:
a)
use strict;
use warnings;
use feature 'say';
use Data::Dumper;
my $debug = 0;
my %points;
my($id,$distance,$name);
my $count = 1;
while(<DATA>){
my ($id,$x,$y,$name) = split '\s+';
$points{$id}{$count} = { x => $x, y => $y };
$points{$id}{name} = $name;
$count++;
$count = 1 if $count > 2;
}
say Dumper(\%points) if $debug;
$~ = 'STDOUT_HEAD';
write;
$~ = 'STDOUT';
foreach $id ( sort keys %points) {
$name = $points{$id}{name};
$distance = distance($points{$id});
write;
}
$~ = 'STDOUT_BOTTOM';
write;
sub distance {
my $p = shift;
my $d = sqrt( ($p->{2}{x} - $p->{1}{x})**2 + ($p->{2}{y} - $p->{1}{y})**2 );
return $d
}
format STDOUT_HEAD =
+--------+------------+----------+
| Area | Distance | Name |
+--------+------------+----------+
.
format STDOUT =
| @<<<<< | @######.## | @<<<<<<< |
$id, $distance, $name
.
format STDOUT_BOTTOM =
+--------+------------+----------+
.
__DATA__
area1 73070 74098 stop
area1 79689 79934 stop
area2 57000 59336 signal
area2 69391 72882 signal
area3 65205 66473 triangle
area3 66888 68294 triangle
area4 44491 48216 block
area4 269762 273388 block
area5 390882 392312 signal
area5 85172 85501 signal
输出
+--------+------------+----------+ | Area | Distance | Name | +--------+------------+----------+ | area1 | 8824.40 | stop | | area2 | 18358.40 | signal | | area3 | 2479.62 | triangle | | area4 | 318511.31 | block | | area5 | 433118.45 | signal | +--------+------------+----------+