我有一个[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);
?>
我试图写一个函数来传递
因此,考虑矩阵(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次......除非显然有更聪明的方法(我是...肯定存在,但 - 目前 - 不在我的脑海里。)
答案 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
显然,任何错误纠正都非常值得赞赏!