如何在Javascript中计算二维旋转
我对三角不太熟悉,但我只有两个点可以在2D中旋转:如何在Javascript中计算二维旋转,javascript,rotation,trigonometry,Javascript,Rotation,Trigonometry,我对三角不太熟悉,但我只有两个点可以在2D中旋转: *nx, ny . - . - . angle - *cx,cy.................*x,y cx,cy=旋转中心 x、 y=当前x,y nx,ny=新坐标 如何以一定角度计算新点 首先,将旋转中心平移到原点 计算新坐标(nx,ny) 平移回原始旋转中心 步骤1 你的新观点是 中心:
*nx, ny
. -
. -
. angle -
*cx,cy.................*x,y
cx,cy=旋转中心x、 y=当前x,y
nx,ny=新坐标 如何以一定角度计算新点
rotate(1, 1, 2, 1, 90);
// > [1, 0]
关于此功能的三个注意事项:
角度
应为正。对于逆时针旋转(如图中所示),它应该是负数rotate(0, 0, 5, 0, 90);
// > [3.061616997868383e-16, -5]
由于这个原因,结果数组的两个元素都应该是浮点。您可以根据需要使用Math.round()
、Math.ceil()
或Math.floor()
将它们转换为整数以上被接受的答案对我来说不正确,旋转是反向的,这里是工作函数
/*
CX @ Origin X
CY @ Origin Y
X @ Point X to be rotated
Y @ Point Y to be rotated
anticlock_wise @ to rotate point in clockwise direction or anticlockwise , default clockwise
return @ {x,y}
*/
function rotate(cx, cy, x, y, angle,anticlock_wise = false) {
if(angle == 0){
return {x:parseFloat(x), y:parseFloat(y)};
}if(anticlock_wise){
var radians = (Math.PI / 180) * angle;
}else{
var radians = (Math.PI / -180) * angle;
}
var cos = Math.cos(radians);
var sin = Math.sin(radians);
var nx = (cos * (x - cx)) + (sin * (y - cy)) + cx;
var ny = (cos * (y - cy)) - (sin * (x - cx)) + cy;
return {x:nx, y:ny};
}
我认为最好使用矩阵进行此类操作 下面是gl矩阵的示例(但您也可以使用类似THREEJS的东西) 在二维情况下,需要绕z轴旋转:
rotateVector([x, y, 0], [cX, cY, 0], [0, 0, 1], angleInRadians);
根据:
(半径)等于r
和旋转中心
旋转点
(度)是以度为单位测量的角度deg
import * as glm from 'gl-matrix';
const rotateVector = (() => {
const q = glm.quat.create();
// const m = glm.mat4.create(); // 2nd way
return (v: glm.vec3, point: glm.vec3, axis: glm.vec3, angle: number) => {
glm.quat.setAxisAngle(q, axis, angle);
// glm.mat4.fromRotation(m, angle, axis); // 2nd way
glm.vec3.sub(v, v, point);
glm.vec3.transformQuat(v, v, q);
// glm.vec3.transformMat4(v, v, m); // 2nd way
glm.vec3.add(v, v, point);
return v;
}
})();
rotateVector([x, y, 0], [cX, cY, 0], [0, 0, 1], angleInRadians);
x = r * cos(deg)
y = r * sin(deg)