Просмотр полной версии : поворот матрицы относительно некой точки
Добрый день всезнающие, многоуважаемые и любимые тов. по Flash.
У меня к Вам маленький вопрос:
есть массив фигуры кпримеру такое:
[[2,1],[2,0],[1,1],[0,1]]
Мне надо его повернуть по часовой стредке, относительно центра этой фигуры.
Сначала делаю просто поворот (относительно (0,0))
public function matrixRotation (arr:Array):Array {
var arr_:Array = arr.concat();
var arr_length:Number = arr.length;
for (var i=0;i<arr_length;i++) {
trace("перставляем элемент");
var i_element = arr_[i][0];
arr_[i][0] = arr[i][1];
arr_[i][1] = i_element;
}
return arr_;
}
Это поворачивает фигуру, но почему-то еще и отзеркаливает (а мне не надо) мне надо как в тетрисе фигурки ворочатся.
Товарищи. как это сделать?
Вместо
12
34
56
78
Надо получить
87
65
43
21
?
Вместо
12
34
56
78
Надо получить
87
65
43
21
?
Да! Если знаете, подскажите
function matrixRotation (arrayA:Array):Array {
var arrayB:Array = arrayA.concat ();
var len:Number = arrayB.length;
var lenH:Number = Math.floor (len / 2);
for (var i:Number = 0; i < len; i++) {
arrayB[i].reverse ();
}
for (var i:Number = 0; i < lenH; i++) {
var array:Array = arrayB[i];
arrayB[i] = arrayB[len - i - 1];
arrayB[len - i - 1] = array;
}
return arrayB;
}
function echo (a) {
for (var i:Number = 0; i < a.length; i++) {
trace (a[i]);
}
trace ("");
var b = matrixRotation (a);
for (var i:Number = 0; i < b.length; i++) {
trace (b[i]);
}
trace ("------------------------");
}
echo ([[1, 2], [3, 4]]);
echo ([[1, 2], [3, 4], [5, 6], [7, 8]]);
echo ([[1, 2, 3], [4, 5, 6], [7, 8, 9]]);
echo ([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, 16]]);
Очень благодарю за код, но все таки он толи против часовой поворачивает, то-ли искажает... фигурки...
Как и просили :)
87
65
43
21
а не
7531
8622
ну да... с
Вместо
12
34
56
78
Надо получить
87
65
43
21 я промазал.
А как сделать чтоб было как на рисуночке, многоуважаемый iNils?
function matrixRotation (arrayA:Array):Array {
var arrayB:Array = new Array ();
var len:Number = arrayA[0].length;
for (var i:Number = 0; i < len; i++) {
arrayB[i] = new Array ();
for (var j:Number = 0; j < arrayA.length; j++) {
arrayB[i][j] = arrayA[j][i];
}
arrayB[i].reverse()
}
return arrayB;
}
function matrixRotation (arrayA:Array):Array {
var arrayB:Array = new Array ();
var len:Number = arrayA[0].length;
for (var i:Number = 0; i < len; i++) {
arrayB[i] = new Array ();
for (var j:Number = 0; j < arrayA.length; j++) {
arrayB[i][j] = arrayA[j][i];
}
arrayB[i].reverse()
}
return arrayB;
}
//задаем
trace(matrixRotation([[0,1],[0,0],[1,0],[0,2]])); //[0,1],[0,0],[2,0],[0,1]
:wacko:
ПС. конечно iNils, Вы дали мне хороший урок что быстрее было б открыть книжку по "Компьютерой графике" или какой-то математике и решить,но все же...
Да не, на выходе не
[0,1],[0,0],[2,0],[0,1]
а
[0,1,0,0],[2,0,0,1]
:)
а как сделать чтоб задавали в виде [[n,n],[n,n], ...] и получали в таком же виде?
Как квадрат сделать кругом?:)
Можно хоть [[n][n][n][n]] сделать, только это искажает смысл.
Как квадрат сделать кругом?:)
Можно хоть [[n][n][n][n]] сделать, только это искажает смысл.
:)
как интерпретировать в фигуру в которой мы задаем i и j кубика?
"Учитесь дети мои" (как сказал в когда-то тов. Гурский, скопировавший у кого-то скопированный код.... в какого-то древнегреческого математика.... 2 миллиона лет назад :) )
function rotation(arr:Array):Array {
trace("до поворота = " + arr);
var xsr:Number = 0;
var ysr:Number = 0;
var arrB:Array = new Array();
var scetchik:Number = 0;
var x:Number = null, y:Number = null, deltaX:Number = null, deltaY:Number = null;
var arr_length:Number = arr.length;
for (var i = 0; i<arr_length; i++) {
xsr += arr[i][0];
ysr += arr[i][1];
}
xsr = Math.round(xsr/arr_length);
ysr = Math.round(ysr/arr_length);
trace("xsr " + xsr);
trace("ysr " + ysr);
for (var j = 0; j<arr_length; j++) {
arrB[j] = new Array();
y = arr[j][0];
x = arr[j][1];
arrB[j][0] = ysr - x + xsr;
arrB[j][1] = xsr+ y -ysr;
}
return arrB;
}
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.