在perl中计算2个点(2组坐标)
我试图计算同一区域内一组坐标之间的距离。使用类型distance=sqrt(x2-x1)^2+(y2-y1)^2)。我知道我很快就要成功了,但我不知怎么搞的,所以我需要一些帮助。在perl中计算2个点(2组坐标),perl,Perl,我试图计算同一区域内一组坐标之间的距离。使用类型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
以下是我写的:
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
其中距离=输入文件的sqrt(第二列的第二行-第二列的第一行^2+第三列的第二行-第二列的第一行^2)
关于我的期望输出:a)我想打印文件的第一列以及坐标计算后的第四列。因为我的级别不足以完成我想要的任务,所以我只能在开始时使用计数器打印第一列,然后像这样打印它“说join'area,$counter'”,或者在输出文件中使用命令行| paste来添加这些列。但是在代码中,我不知道如何做到这一点,因此如果有人能在这方面提供帮助,我将不胜感激。
b)起初,我只通过对两列进行减法来测试代码,效果很好,但当我试图在foreach循环中添加sqrt时,我弄糟了请参见下面的代码示例。我希望你能学到一些新的有用的东西,尝试改变你的编程风格
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
我发布的代码就是我试图运行的代码。。。我知道在第38、42、44行有一些错误,这是使用foreach循环造成的。当我在foreach循环中添加$final=sqrt(($x2)+($y2))作为代码行时,我的问题就开始了。不,问题来自于这个jibberish:
ceil(My$final;)
一旦修复,使用$row
而不声明它就会出现错误。对我的$row(…){…}使用,一旦它被修复,使用不存在的数组@row
就会出现错误$row[…]
应该是$row->[…]
(数组的元素被$row
中的引用引用引用)我不明白为什么我的问题得到-1。。。。我为自己编写代码付出了很多努力。我对perl一无所知。如果我能正确地编写代码,我就不会在这里发布任何问题。。很好用!!!。我对输出非常兴奋。我一次又一次地按命令提示符上的enter按钮,只看到输出正在运行。我将保留它作为模板从现在开始。非常感谢你!
+--------+------------+----------+
| Area | Distance | Name |
+--------+------------+----------+
| area1 | 8824.40 | stop |
| area2 | 18358.40 | signal |
| area3 | 2479.62 | triangle |
| area4 | 318511.31 | block |
| area5 | 433118.45 | signal |
+--------+------------+----------+