围绕另一个点旋转点的哪种方法最好?

时间:2015-07-25 12:57:26

标签: math rotation 2d 2d-games

很长一段时间以来,我一直只用以下方式进行轮换:

setOrigin(screenWidth/2, screenHeight/2)
theta = approach(360)    // cycles from 0 to 360
cP = vec2(0, 0)          // center point
rp = vec2(0, 100)        // rotated point

rP.x = cP.x + cos(theta) * 100 //cos accepts degrees
rP.y = cP.y + sin(theta) * 100 //sin accepts degrees

但是我发现以下方法相当普遍

setOrigin(screenWidth/2, screenHeight/2)
theta = approach(360)    // cycles from 0 to 360
cP = vec2(0, 0)          // center point
rp = vec2(0, 100)        // rotated point

rPx = cP.x + (rP.x * cos(theta) - rP.y * sin(theta)) * 100 //cos accepts degrees
rPy = cP.y + (rP.y * sin(theta) + rP.x * cos(theta)) * 100 //sin accepts degrees
rP = {rPx, rPy}

我理解为什么第二个版本在数学上有效,我只是不确定为什么在更简单的第一个方法上更喜欢它(除了将值放在矩阵中并执行转换的明显情况)

1 个答案:

答案 0 :(得分:1)

您的第一种方法是第二种方法的简化版本,您只允许差异向量(从旋转中心到旋转点)为水平线。如果您插入rp.y而不是100,则会看到第二个版本的公式,rp.x部分被移除。

顺便说一下,第二个公式并不完全正确。 * 100错误,因为您已经乘以rp。在第二行中,您必须将rp.yrp.x交换为:

rPy = cP.y + (rP.x * sin(theta) + rP.y * cos(theta))