/*
CX @ Origin X
CY @ Origin Y
X @ Point X to be rotated
Y @ Point Y to be rotated
*/
function rotate(CX, CY, X, Y, angle) {
var rad = angle * Math.PI / 180.0;
var nx = Math.cos(rad) * (X-CX) - Math.sin(rad) * (Y-CY) + CX;
var ny = Math.sin(rad) * (X-CX) + Math.cos(rad) * (Y-CY) + CY;
return [nx,ny];
}
3 回答
前两个参数是中心点的X和Y坐标(第二个点将围绕其旋转的原点) . 接下来的两个参数是我们将要旋转的点的坐标 . 最后一个参数是角度,以度为单位 .
例如,我们将取点(2,1)并将其绕点(1,1)顺时针旋转90度 .
关于这个功能的三个注释:
对于顺时针旋转,最后一个参数
angle
应为正 . 对于逆时针旋转(如您提供的图表中所示),它应为负数 .请注意,即使你提供的参数应该产生一个坐标为整数的点 - 即将点(5,0)绕原点(0,0)旋转90度,这应该产生(0,-5) - JavaScript的舍入行为意味着任何一个坐标仍然可能是一个令人沮丧地接近预期整数的值,但仍然是一个浮点数 . 例如:
因此,结果数组的两个元素都应该是float . 您可以根据需要使用
Math.round()
,Math.ceil()
或Math.floor()
将它们转换为整数 .首先,将旋转中心转换为原点
计算新坐标(nx,ny)
转换回原始旋转中心
Step 1
你的新观点是
中心:(0,0)
点:(x-cx,y-cy)
Step 2
nx =(x-cx)* cos(theta) - (y-cy)* sin(theta)
ny =(y-cy)* cos(theta)(x-cx)* sin(theta)
Step 3
转换回原始旋转中心:
nx =(x-cx)* cos(theta) - (y-cy)* sin(theta)cx
ny =(y-cy)* cos(theta)(x-cx)* sin(theta)cy
为了更深入的解释,有一些花哨的图表,我建议看this .
以上接受的答案对我来说不正常,轮换是相反的,这里是工作功能