php函数转换围绕轴点的(x,y)坐标矩阵

时间:2015-11-12 18:30:08

标签: php matrix rotation transpose

我有一个[n x m]个元素矩阵,其中心可能不在坐标(x,y)0,0上:

<?php
$matrix_yx = array(
     21 => array(10,11,12),
     22 => array(10,11,12),
     23 => array(10,11,12),
     24 => array(10,11,12)
);
$origin_yx = array(23,11);
?>

我试图写一个函数来传递

  1. 矩阵
  2. 枢轴坐标用作支点
  3. 最终旋转程度(可以只有90,180或270)
  4. 因此,考虑矩阵(x,y)元素的表示:

    y
    ^
    | 10,24   11,24   12,24
    | 10,23  >11,23<  12,23
    | 10,22   11,22   12,22
    | 10,21   11,21   12,21
    +-----------------------> x
    

    我需要旋转它90&#39;顺时针绕点(11,23),基本上得到一个像这样的新矩阵:

    y
    ^
    | 09,24   10,24   11,24   12,24
    | 09,23   10,23  >11,23<  12,23
    | 09,22   10,22   11,22   12,23
    +-------------------------------> x
    

    我有点困惑,好像(x,y)原点在坐标(0,0)上那么它会很简单,因为

    (x,y) = (11,23)
    
    翻译90&#39;大约(0)我会得到

    function Rotate($matrix) {
        list($x,y) = array($y,-$x);
        (x,y) = (23,-11);
    }
    

    但是,如果我想传递不同的轴坐标,我必须考虑什么?

    function Rotate($matrix, $pivot_x, $pivot_y) {
        //-- (...)
    }
    

    如果我必须转换180度或270度(而不是90度)的矩阵,那么功能将被称为2或3次......除非显然有更聪明的方法(我是...肯定存在,但 - 目前 - 不在我的脑海里。)

1 个答案:

答案 0 :(得分:0)

根据@Laurentiu建议,这是应该回复我的问题的函数:

$matrix = array(
     21 => array(10,11,12),
     22 => array(10,11,12),
     23 => array(10,11,12),
     24 => array(10,11,12)
);

function Rotate($matrix, $pivot_x, $pivot_y) {
        $output = array();
        krsort($matrix);
        while (list($y) = each($matrix)) {
                reset($matrix[$y]);
                while (list(,$x) = each($matrix[$y])) {
                        list($offset_x,$offset_y) = array(
                                ($pivot_y - $y),
                                -1 * ($pivot_x - $x)
                        );
                        list($newx,$newy) = array($pivot_x - $offset_x , $pivot_y - $offset_y);

                        $output[$newy][] = $newx;
                }
        }
        return($output);
}

所以,从这样的矩阵开始......

10,24    11,24    12,24
10,23   >11,23<   12,23
10,22    11,22    12,22
10,21    11,21    12,21

如果我在pivot(x,y)上旋转(11,23)..

$output  = Rotate($matrix, 11, 23);

9,24    10,24    11,24    12,24
9,23    10,23   >11,23<   12,23
9,22    10,22    11,22    12,22

而如果我在pivot(0,0)上旋转:

$output = Rotate($matrix, 0, 0);

21,-10    22,-10    23,-10    24,-10
21,-11    22,-11    23,-11    24,-11
21,-12    22,-12    23,-12    24,-12

显然,任何错误纠正都非常值得赞赏!