2

ネットの C++ の例を使用してこのコードを作成し、ポイントのセットを 3D で回転させました。

#@matrix is points and their 3D coordinates.
@rotated_matrix = rotate_l(\@matrix, 0);

sub rotate_l {
  my $ref = $_[0];
  my $x = 0;
  my $step = 1;

  #if rotx
  if ($_[1] == 0) {
    while ($$ref[$x][0]) {
      $$ref[$x][1] += ($$ref[$x][1]*cos($step) - $$ref[$x][2]*sin($step));
      $$ref[$x][2] += ($$ref[$x][1]*sin($step) + $$ref[$x][2]*cos($step));
      $x++;
    }
  }

  #if roty
  if ($_[1] == 1) {
    while ($$ref[$x][0]) {
      $$ref[$x][0] += ( $$ref[$x][0]*cos($step) + $$ref[$x][2]*sin($step));
      $$ref[$x][2] += (-$$ref[$x][0]*sin($step) + $$ref[$x][2]*cos($step));
      $x++;
    }
  }


  #if rotz
  if ($_[1] == 2) {
    while ($$ref[$x][0]) {
      $$ref[$x][0] += ($$ref[$x][0]*cos($step) - $$ref[$x][1]*sin($step));
      $$ref[$x][1] += ($$ref[$x][0]*sin($step) + $$ref[$x][1]*cos($step));
      $x++;
    }
  }

 return @$ref;
}

しかし、何かが間違っています。オブジェクトのサイズ/フォームは同じままではありません。そして、私の数学は、その理由を理解するほど良くありません。+=必要かどうかさえわかりませんか=

4

2 に答える 2

-1

私があなたに推奨することの意味の例として:

#! /usr/bin/env perl
use common::sense;
use YAML 'Dump';

sub translate {
  my ($deltaX, $deltaY) = @{pop()};  # <-- don't mind this.
  for (@_) {    # <--- this is the important part
    $_->[0] += $deltaX;
    $_->[1] += $deltaY;
  }
  @_
}

my @points = ([0, 1], [0, -1], [-1, 0], [1, 0]);

print Dump([translate @points, [2, 2]]);

my $box = \@points;

print Dump([translate @$box, [5, 0]]);
于 2013-05-16T16:39:20.747 に答える