如何计算角度和距离之外的点?

时间:2016-04-28 15:46:50

标签: java math

我从这个论坛搜索并实现了一些东西,它没有出来。 我想要实现的是为玩家子弹计算相对于spawnPointposition的{​​{1}}。

rotation应该和他的spawnPoint(播放器默认设置为指向右侧)和X + his width(从y + height/2的中心产生轴)。

这是我从这个论坛得到的:

Y

this.bulletSpawn.x = (float)(this.position.x + this.width/2 + this.width * Math.cos(rotation)); this.bulletSpawn.y = (float)(this.position.y + this.height/2 + this.height/2 * Math.sin(rotation)); 位于Radians中。 rotationthis类。

图片展示了我期望发生的事情:

红点是我想知道玩家PlayerspawnPoint的{​​{1}}。 玩家Sprite是旋转的,它旋转与他的中心x和y相关,这是用lib完成的,我没有这些变量。整个箭头是玩家,箭头方向是玩家指向的位置,红点是bulletSpawn点(或预期的点)

使用我发布的代码,子弹似乎是从其他地方产生的。即使在开始时他们也有一个偏移量,当我旋转玩家时,position似乎与我所期望的不同来源相关。

这是子弹位置代码:

rotation

这是在spawnPoint课程内。 position.x = holder.bulletSpawn.x - (float)(this.width/2 * holder.rotation); position.y = holder.bulletSpawn.y - (float)(this.height/2 * holder.rotation); 变量是Bullet positionVector2是播放器实例。此代码仅用于为子弹在其自身大小的中心生成一个偏移量

我添加了一些与注释相关的修正,但子弹仍然有一个微小的偏移,在某些角度看起来不对。 基本上我想要的距离是玩家的宽度,他的中心y是身高/ 2。

2 个答案:

答案 0 :(得分:0)

我们的初始位置是X0, Y0,旋转大约是中心点CX, CY,旋转角度是Theta。所以轮换后的新位置是:

 NX = CX + (X0-CX) * Cos(Theta) - (Y0-CY) * Sin(Theta)
 NY = CY + (X0-CX) * Sin(Theta) + (Y0-CY) * Cos(Theta)

该方程描述了关于中心点的任意点旋转的仿射变换,仿射矩阵是平移,旋转和反向平移矩阵的组合。

关于中心CX,CY - 您写的

  

它与左下角的x和y原点相关地旋转

关于初始点坐标 - 对于子弹似乎是

X + Width, Y + Height/2

答案 1 :(得分:0)

快捷扩展名:

extension CGSize {
    static func offsetFrom(angle:CGFloat, distance:CGFloat) -> CGSize {
        let rad = angle * CGFloat.pi / 180
        return CGSize(width: sin(rad) * distance, height: cos(rad) * distance)
    }
}