Javascript 如何根据中心单元旋转对象

Javascript 如何根据中心单元旋转对象,javascript,Javascript,我有一个网格,在这个网格上我放置了一个我想围绕固定单元(cell3)旋转的对象。对象包含坐标,如: activeObject = { coords: { cell1: { x: 0, y: 0 }, cell2: { x: 1, y: 1 }, cell3: { x: 2,

我有一个网格,在这个网格上我放置了一个我想围绕固定单元(cell3)旋转的对象。对象包含坐标,如:

activeObject = {
    coords: {
        cell1: {
             x: 0,
             y: 0
        },
        cell2: {
             x: 1,
             y: 1
        },
        cell3: {
             x: 2,
             y: 2
        },
        cell4: {
             x: 2,
             y: 3
        },
        cell5: {
             x: 3,
             y: 3
        },
    }
}
输出:

我想围绕单元格3旋转这个对象,例如使用x:2,y:2,而不使用某种(基本)三角学对每个单元格位置进行硬编码。我意识到我必须检查每个细胞离细胞3有多远,以及方向。但是我不知道怎么计算,因为我对三角学不太在行。新的活动对象将是:

activeObject = {
    coords: {
        cell1: {
             x: 4,
             y: 0
        },
        cell2: {
             x: 4,
             y: 1
        },
        cell3: {
             x: 2,
             y: 2
        },
        cell4: {
             x: 1,
             y: 2
        },
        cell5: {
             x: 1,
             y: 3
        },
    }
}
输出:

一些基本思想

  • 如果轴不是原点,则必须对变换应用某些更正
  • 如果点位于(1,2),则围绕原点旋转
    • 90°CW:变为(2,-1)
    • 逆时针90度:变为(-2,1)
  • 点(x,y)的结论
    • 90°CW:变成(y,-x)
    • 逆时针90度:变为(-y,x)
  • 至少对枢轴应用校正
找到了一些数学知识

功能点(x,y){
这个.x=x;
这个。y=y;
}
Point.prototype.rotateCW=函数(c){
//x'=x cos phi+y sin phi\轴为(0,0)的公式
//y'=-x正弦φ+y余弦φ/
//φ=90°插入φ
//cos 90°=0 sin 90°=1计算cos和sin
//x'=y\轴位于(0,0)的公式
//y'=-x/
//x'=(cy-y)+cx\具有不同枢轴的公式需要更正
//y'=-(cx-x)+cy/
//y'=-cx+x+cy/
返回新点(
c、 x+c.y-这个.y,
c、 y-c.x+这个.x
);
}
Point.prototype.rotateCW=函数(c){
//资料来源:https://en.wikipedia.org/wiki/Rotation_(数学)#二维
//x'=x cos phi+y sin phi\轴为(0,0)的公式
//y'=-x正弦φ+y余弦φ/
//φ=-90°
//cos-90°=0 sin-90°=1
//x'=-y\轴位于(0,0)的公式
//y'=x/
//x'=-(cy-y)+cx\具有不同枢轴的公式需要校正
//x'=-cy+y+cx/
//y'=(cx-x)+cy/
返回新点(
c、 x-c.y+this.y,
c、 y+c.x-这个.x
);
}
var activeObject={
协调:{
单元格1:新点(0,0),
单元格2:新点(1,1),
单元3:新点(2,2),
第四单元:新点(2,3),
第五单元:新点(3,3),
}
},
枢轴=新点(2,2),
旋转={coords:{}};
key(activeObject.coords).forEach(函数(k){
rotated.coords[k]=activeObject.coords[k].rotateCW(pivot);
});

document.write(''+JSON.stringify(旋转,0,4)+'')这就是我要找的。谢谢你,尼娜