Perl中计算2点(2组坐标)

问题描述 投票:0回答:1

我正在尝试计算同一区域中一组坐标之间的距离。使用类型[[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)。

关于我想要的输出:

a)

我要打印文件的第一列以及坐标计算后的第四列。因为我的水平不足以执行我想要的操作,所以只能在开始时使用计数器来打印第一列,然后像这样进行打印“ say join'area,$ counter'”,或使用在我的输出文件中使用命令行| paste添加这些列。但是在代码内部,我不知道该怎么做,所以如果有人可以在这方面提供帮助,我将非常感激。b)最初,我仅通过对两列进行减法来测试我的代码,并且可以正常工作,但是当我尝试在foreach循环中添加sqrt时,我搞砸了
perl
1个回答
0
投票
请参阅以下代码示例。我希望您能学到一些新的有用的东西,尝试改变您的编程风格。

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 | +--------+------------+----------+

© www.soinside.com 2019 - 2024. All rights reserved.