У меня есть матрица элементов [nxm], где центр может не находиться на координате (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 градусов по часовой стрелке вокруг точки (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 'вокруг (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 раза... если явно не существует более разумного подхода (который, я уверен, существует, но на данный момент - не на мой взгляд).
Следуя предложению @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
Если я повернусь на поворот (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
Если я вращаюсь по оси вращения (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
Очевидно, что любая коррекция ошибок более чем оценена!