Javascript:围绕某个X / Y点旋转数组(2d矩阵)

时间:2017-11-18 09:09:59

标签: javascript jquery arrays math matrix

所以,我有一个像这样的数组:

    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)))

0 个答案:

没有答案