Advertisement
cd62131

Theta

Jul 23rd, 2014
364
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 2.24 KB | None | 0 0
  1. #!/usr/bin/perl
  2. use strict;         # my を強制する
  3. use warnings;       # より多く警告を出す
  4. use feature 'say';  # say (改行付き print) を使用する
  5. use Math::Trig;
  6. sub theta {                          # サブルーチン theta
  7.   my ($x1, $y1, $x2, $y2) = @_;      # 引数を分割代入する
  8.   return '' if abs($y1 - $y2) > 10;  # 条件が満たされたら、空文字を返す
  9.   # すべての引数に、deg2rad を適用する
  10.   ($x1, $y1, $x2, $y2) = map { deg2rad $_ } ($x1, $y1, $x2, $y2);
  11.   my $theta = rad2deg(
  12.     acos(1 - (1 / 2) *
  13.       (
  14.         (cos($y1) * sin($x1) - cos($y2) * sin($x2)) ** 2 +
  15.         (cos($y1) * cos($x1) - cos($y2) * cos($x2)) ** 2 +
  16.         (sin($y1) - sin($y2)) ** 2
  17.       )
  18.     )
  19.   );
  20.   return $theta;  # 通常値の return
  21. }
  22. my $data = [];        # @d = (); $data = \$d; の略。2値データを蓄積する
  23. my $result = [];      # 5値データを蓄積する
  24. while (<>) {          # デフォルトのインプットソースから読み込み、行を $_ に代入
  25.   chomp;              # chomp $_; の略。改行を削除する
  26.   my @d = split;      # split $_; の略。空白類で分割し配列を返す
  27.   push @$data, \@d;   # @$ は配列のデリファレンス。$data に、ローカル配列を蓄積
  28. }
  29. my $size = scalar @$data;                   # スカラ参照で、配列のサイズを取得
  30. for (my $i = 0; $i < $size; $i++) {         # 2重の for で、すべての組み合わせを
  31.   for (my $j = $i + 1; $j < $size; $j++) {  # 作成する
  32.     # $data はリファレンスなので、-> で値を参照できる
  33.     my $r = [$data->[$i][0], $data->[$i][1], $data->[$j][0], $data->[$j][1]];
  34.     my $theta = theta @$r;                  # sub theta で計算
  35.     next if $theta eq '';                   # 返り値が空文字なら、次の繰り返しへ
  36.     push @$r, $theta;                       # 4値に、値を push
  37.     push @$result, $r;                      # その5値を result に蓄積
  38.   }
  39. }
  40. @$result = sort { $a->[4] <=> $b->[4] } @$result; # 配列の配列を5番の値でソート
  41. foreach my $r (@$result) {  # 配列の配列から、1つずつ配列を取り出す
  42.   say join "\t", @$r;       # tab もじで 結合した結果を印字
  43. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement