Advertisement
kijato

Affin transzformáció

Jun 14th, 2019
499
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 3.83 KB | None | 0 0
  1. use strict;
  2. use Data::Dumper; # print Dumper(\%s);
  3. use Data::Dumper::Concise; # kulcsok rendezése ABC szerint
  4. use Data::Printer; # p %variable;
  5.  
  6. my @pontok = (); # pontok mindkét rendszerben
  7. my %affin = ( a=>0, b=>0, c=>0, d=>0 ); # paraméterek
  8. my %s = ( y1=>0, x1=>0, y2=>0, x2=>0 ); # súlypont, és hozzá közhető adatok
  9.  
  10. open FH,$ARGV[0] or die "$!\n";
  11. my @row;
  12. my $sorszam=0;
  13. while(<FH>){
  14.     if(++$sorszam==1){next;}
  15.     chomp;
  16.     s/\s+//g;
  17.     @row = split(/;/);
  18.     push @pontok,{ id=>$row[0], y1=>$row[1], x1=>$row[2], y2=>$row[3], x2=>$row[4] };
  19.     $s{'y1'}+=$row[1];
  20.     $s{'x1'}+=$row[2];
  21.     $s{'y2'}+=$row[3];
  22.     $s{'x2'}+=$row[4];
  23. }
  24. close FH;
  25. print"\nPontok:\n"; p @pontok;
  26.  
  27. # súlypont számítása
  28. foreach ( keys %s ) {
  29.     $s{$_}/=@pontok;
  30. }
  31. print"\nsúlypont:\n", Dumper(\%s);
  32.  
  33. foreach my $p ( @pontok ) {
  34.     # súlyponti koordináták számítása
  35.     foreach ( ('y1','x1','y2','x2') ) {
  36.         $p->{'s_'.$_}=$p->{$_}-$s{$_};
  37.     }
  38.     # együtthatók számítása
  39.     $s{'yy'} += $p->{'s_y1'} * $p->{'s_y1'};
  40.     $s{'yx'} += $p->{'s_y1'} * $p->{'s_x1'};
  41.     $s{'ya'} += $p->{'s_y1'} * $p->{'s_y2'};
  42.     $s{'yb'} += $p->{'s_y1'} * $p->{'s_x2'};
  43.     $s{'xx'} += $p->{'s_x1'} * $p->{'s_x1'};
  44.     $s{'xa'} += $p->{'s_x1'} * $p->{'s_y2'};
  45.     $s{'xb'} += $p->{'s_x1'} * $p->{'s_x2'};
  46. }
  47. # paraméterek számítása
  48. $affin{'a'} = ( ( $s{'ya'} * $s{'xx'} ) - ( $s{'xa'} * $s{'yx'} ) ) / ( ( $s{'yy'} * $s{'xx'} ) - ( $s{'yx'} * $s{'yx'} ) );
  49. $affin{'b'} = ( ( $s{'xa'} * $s{'yy'} ) - ( $s{'ya'} * $s{'yx'} ) ) / ( ( $s{'yy'} * $s{'xx'} ) - ( $s{'yx'} * $s{'yx'} ) );
  50. $affin{'c'} = ( ( $s{'yb'} * $s{'xx'} ) - ( $s{'xb'} * $s{'yx'} ) ) / ( ( $s{'yy'} * $s{'xx'} ) - ( $s{'yx'} * $s{'yx'} ) );
  51. $affin{'d'} = ( ( $s{'xb'} * $s{'yy'} ) - ( $s{'yb'} * $s{'yx'} ) ) / ( ( $s{'yy'} * $s{'xx'} ) - ( $s{'yx'} * $s{'yx'} ) );
  52. print "\nParaméterek:\n"; p %affin;
  53.  
  54. #pktr^[i].a:=as + a*(pktr^[i].y-ys) + b*(pktr^[i].x-xs);
  55. #pktr^[i].b:=bs + c*(pktr^[i].y-ys) + d*(pktr^[i].x-xs);
  56.  
  57. foreach my $p ( @pontok ) {
  58.     foreach ( ('y1','x1','y2','x2') ) {
  59.     #pktr^[i].ey:=pktr^[i].a-(as + a*(pktr^[i].y-ys) + b*(pktr^[i].x-xs));
  60.     #pktr^[i].ex:=pktr^[i].b-(bs - b*(pktr^[i].y-ys) + a*(pktr^[i].x-xs));
  61.     #pktr^[i].em:=sqrt(sqr(pktr^[i].ey)+sqr(pktr^[i].ex));
  62.     $p->{'ey'} =  ( $s{'y2'} + $affin{'a'} * ( $p->{y1} - $s{'y1'} ) + $affin{'b'} * ( $p->{x1} - $s{'x1'} ) ) - $p->{y2};
  63.     $p->{'ex'} =  ( $s{'x2'} + $affin{'c'} * ( $p->{y1} - $s{'y1'} ) + $affin{'d'} * ( $p->{x1} - $s{'x1'} ) ) - $p->{x2};
  64.     $p->{'em'} = sqrt( $p->{'ey'}**2 + $p->{'ex'}**2 );
  65.     }
  66. }
  67. print"\nPontok:\n"; p @pontok;
  68. print"\nSúlypont:\n"; p %s;
  69.  
  70. print "\nEltérések:\n";
  71. foreach my $p ( @pontok ) {
  72.     foreach ( ('id','y1','x1','y2','x2','ey','ex','em') ) {
  73.         print "$_: ".$p->{$_}."\t";
  74.     }
  75.     print "\n";
  76. }
  77.  
  78.  
  79. __END__
  80.  
  81. foreach ( keys %affin ) { print $_.": ".$affin{$_}."\n"; }
  82. foreach my $key (keys %{ $ad_grp_ref }) { ... }
  83.  
  84. Paraméterek:
  85. {
  86.     a   8.33797203269079,
  87.     b   5.51619933636013,
  88.     c   -5.52052610314876,
  89.     d   8.33961010715281
  90. }
  91.  
  92. Súlypont:
  93. {
  94.     xa   -11991.63875,
  95.     xb   342988.5035,
  96.     xx   27939.70425475,
  97.     x1   297.10375,
  98.     x2   137031.5,
  99.     ya   671628.18175,
  100.     yb   -683588.2195,
  101.     yx   -19922.42432175,
  102.     yy   93730.73482475,
  103.     y1   513.16825,
  104.     y2   676764.25
  105. }
  106.  
  107. Pontok és eltérések:
  108. id: 1   y1: 401.038     x1: 427.743     y2: 676550.0    x2: 138740.0    ey: -0.0567443660693243  ex: -0.0016182315594051   em: 0.0567674356826987
  109. id: 2   y1: 668.69      x1: 303.107     y2: 678094.0    x2: 136223.0    ey:  0.101125641143881   ex:  0.00288389337947592  em: 0.101166754113123
  110. id: 3   y1: 658.848     x1: 201.383     y2: 677451.0    x2: 135429.0    ey: -0.0910563964862376  ex: -0.00259673944674432  em: 0.0910934157709172
  111. id: 4   y1: 324.097     x1: 256.182     y2: 674962.0    x2: 137734.0    ey:  0.0466751214116812  ex:  0.00133107759756967  em: 0.0466940973396631
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement