Расчет 2 точек (2 набора координат) в perl - PullRequest
0 голосов
/ 11 февраля 2020

Я пытаюсь вычислить расстояния между набором координат в одной и той же области. Используя тип 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 (second_line второго столбца - первая строка второго столбца ^ 2 + вторая строка третьего столбца - первая строка второго столбца ^ 2) моего входного файла.

Относительно желаемого результата:
a) Я хочу напечатать 1-й столбец Мой файл, а также 4-й после расчета координат. Поскольку мой уровень недостаточно хорош, чтобы делать то, что я хочу, я могу напечатать первый столбец только с помощью счетчика в начале и напечатать его так: "say join" area, $ counter '", или использовать командную строку | paste в моем выходном файле, чтобы добавить эти столбцы. Но внутри кода я понятия не имею, как это сделать, поэтому, если кто-то может помочь в этой части, я буду благодарен.
b) Сначала я проверил свой код, выполнив только вычитание из 2 колонки и работает отлично, но когда я попытался добавить sqrt в foreach l oop я испортил

1 Ответ

3 голосов
/ 12 февраля 2020

Пожалуйста, смотрите следующий пример кода. Я надеюсь, что вы узнаете что-то новое и полезное, попробуйте изменить свой стиль программирования.

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   |
+--------+------------+----------+
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...