如何在Android Studio中获取已旋转的对象(x,y)?

时间:2017-02-19 04:41:15

标签: java android android-studio canvas android-canvas

我正在使用Android Studio中的游戏,该游戏的对象围绕屏幕中心旋转。我的问题是,由于某种原因,在旋转对象后,x和y位置保持不变(我猜是因为画布旋转后它仍然在该画布中具有相同的点)。我需要x和y坐标来计算碰撞检测。在意识到x和y没有改变之后,我试图编写一个函数,它将使用基本的trig来计算x和y但是由于某种原因它也吐出了奇怪的值(也在下面附上)。我的问题是如何在主画布中找到此对象的x和y位置?先谢谢,代码如下。

`private int x;     private int y;

    private int getPlayerX(int rotation){
    double angleA;
    double angleC;
    double sideC;
    double sideA;

    angleA = 180 - ((180 - rotation) + 90);
    sideC = Constants.width / 2 + Constants.height / 8;
    angleC = 180 - rotation;

    sideA = ((Math.sin(angleA) * sideC)) / (Math.sin(angleC));

    playerx = Constants.width / 2 + (int) sideA;

    return playerx;
}
private int getPlayerY(int rotation){
    double sideC;
    double angleC;
    double angleB;
    double sideB;

    sideC = Constants.width / 2 + Constants.height / 8;
    angleC = 180 - rotation;
    angleB = 90;

    sideB = sideC * (Math.sin(angleB)) / (Math.sin(angleC));

    playery = Constants.height + (int) sideB;

    return playery;
}

下面的代码是我尝试找到x和y坐标,但它只吐出奇怪的值,我找不到问题。这段代码是我的主要课程。

`

<a id="a1" href="https://www.google.ca">Google</a>
<button onclick="changeAudio(event)">Click Me</>

<script>
var a1 = document.getElementById('a1')

function changeAudio(e){
  e.preventDefault()
  var audio = document.createElement('audio')
  audio.src = a1.href
  document.body.appendChild(audio)
}
</script>

1 个答案:

答案 0 :(得分:0)

尝试查看矩阵。这是定义对象转换的更好实践。 看这里https://en.m.wikipedia.org/wiki/Transformation_matrix 例如:

public Player(){
   //...
   //matrix 3x3 with all transformations you need
   Matrix3f m;

   void rotate(float angle) {
       Matrix3f rot = new Matrix3f();
       rot.data = {cos(angle), -sin(angle), 0.0,
                   sin(angle), cos(angle), 0.0,
                   0.0,        0.0,        1.0 }
       m.Multiply(rot);  
   }

   //get the world position of a local point
   vec2f getWorld(vec2f inPt) {
       vec3f p = vec3f(inPt.x, inPt.y, 1.0);
       p = m.Transform(p);
       return vec2f(p.x, p.y);
   }

   //get the local position of a world point
   vec2f getLocal(vec2f inPt) {
       Matrix3f invM = m.Invert();
       vec3f p = vec3f(inPt.x, inPt.y, 1.0);
       p = invM.Transform(p);
       return vec2f(p.x, p.y);
   }

使用Transform,Invert,Multiply等方法的类Matrix3f,vec3f,vec2f你应该自己提供(你可以在网络中找到很多代码示例)