所以,我有一个像这样的数组:
var my_array = [
'00000000000000000',
'00000111111110000',
'00000111111110000',
'00000111111110000',
'00000111111110000',
'00000111111110000',
'00000000000000000'
]
...我希望得到一个能够将数组( 2d矩阵)旋转一定角度(例如30°)的函数在某个点附近( x / y数组的中心:例如X:8,Y:3 )。
所以30°的结果可能看起来像这样:(数组不是那么精确,只是一个例子......)
var rotated_array = [
"00000000000000000",
"00000000001100000",
"00000000111110000",
"00000001111111000",
"00000111111111100",
"00000111111111000",
"00000011111100000",
"00000001110000000",
"00000000100000000",
"00000000000000000"
]
我已经创建了一个你可以在下面找到的函数,但该函数有一些错误(旋转的矩阵缺少一些点并且看起来有点被破坏 - >你可以在下面自己测试它。)
我希望有人可以帮我修复我的代码,所以不过......
先谢谢,乔纳斯。
顺便说一句:我已经标记了所有从未用过'*'字符的'新'点,之后我会用零来代替!
var my_array = [
'00000000000000000000000',
'00000000000000000000000',
'00000000000000000000000',
'00000000000000000000000',
'00000011111111000000000',
'00000011111111000000000',
'00000011111111000000000',
'00000011111111000000000',
'00000011111111000000000',
'00000000000000000000000',
'00000000000000000000000',
'00000000000000000000000',
'00000000000000000000000'
]
Array.prototype.rotate_matrix = function(angle, cx, cy) {
function generate_matrix(rows,cols,value){
var arr = [];
for (var i=0; i < rows; i++) {
arr.push([]);arr[i].push(new Array(cols));
for (var j=0; j < cols; j++) arr[i][j] = value;
}; return arr;
}
var radians = (Math.PI / 180) * angle;
var array = generate_matrix(this.length, this[0].length, '*')
for (var i=0; i<this.length; i++) {
for (var j=0; j<this[i].length;j++) {
var character = this[i][j],
cos = Math.cos(radians),
sin = Math.sin(radians),
newx = Math.round((cos * (j - cx)) + (sin * (i - cy)) + cx) < this[i].length ? Math.round((cos * (j - cx)) + (sin * (i - cy)) + cx) : -1,
newy = Math.round((cos * (i - cy)) - (sin * (j - cx)) + cy) < this[i].length ? Math.round((cos * (i - cy)) - (sin * (j - cx)) + cy) : 1;
try {array[newy][newx]=character;}
catch(e) {
array[i][j] = character
}
}
}
array = array.map(a => [a.join('')])
return array.concat.apply([],array);
}
console.log(my_array.rotate_matrix(30,(my_array[0].length/2),(my_array.length/2)))