位图旋转矩阵-Android

位图旋转矩阵-Android,android,matrix,bitmap,bearing,Android,Matrix,Bitmap,Bearing,我有一个自定义地图(画布),我正在上面绘制地图指针。我在我的主类的onLocationChanged方法中更新它,但是我正在努力使位图旋转。getBearing()似乎不起作用(至少对我来说不起作用),因此我正在寻找地图上点之间的坡度。任何帮助都将不胜感激 public void setBearing(Point prev, Point curr){ float slope = 1; if (prev.x - curr.x !=0){ slope = (float) ((y1

我有一个自定义地图(画布),我正在上面绘制地图指针。我在我的主类的onLocationChanged方法中更新它,但是我正在努力使位图旋转。getBearing()似乎不起作用(至少对我来说不起作用),因此我正在寻找地图上点之间的坡度。任何帮助都将不胜感激

public void setBearing(Point prev, Point curr){

  float slope = 1;
  if (prev.x - curr.x !=0){
     slope = (float) ((y1-y2)/(x1-x2));
     bearing = (float) Math.atan(slope);
  }

}

编辑:

使用纬度和经度坐标来寻找方位比简单地在两点之间更困难。但是,此代码(根据找到的代码进行修改)运行良好:

public void setBearing(Location one, Location two){
  double lat1 = one.getLatitude();
  double lon1 = one.getLongitude();
  double lat2 = two.getLatitude();
  double lon2 = two.getLongitude();
  double deltaLon = lon2-lon1;
  double y = Math.sin(deltaLon) * Math.cos(lat2);
  double x = Math.cos(lat1)*Math.sin(lat2) - Math.sin(lat1)*Math.cos(lat2)*Math.cos(deltaLon);
  bearing = (float) Math.toDegrees(Math.atan2(y, x));
}

为了以最小的混乱和零风险划分正确计算角度,
atan2()
应优先于
atan()
。以下函数返回相对于非零矢量x轴的角度,从
a
b

public float getBearing(Point a, Point b) { // Valid for a != b.
    float dx = b.x - a.x;
    float dy = b.y - a.y;
    return (float)Math.atan2(dy, dx);
}

由于我不熟悉您的API,因此无法就如何按给定角度旋转位图给出建议。

以下是如何旋转位图:

以防您要旋转ImageView

private void rotateImage(ImageView imageView, double angle) {

    Matrix matrix = new Matrix();
    imageView.setScaleType(ScaleType.MATRIX); // required
    matrix.postRotate((float) angle, imageView.getDrawable().getBounds()
            .width() / 2, imageView.getDrawable().getBounds().height() / 2);
    imageView.setImageMatrix(matrix);
}

谢谢你的反馈。我想知道如何使用atan2,所以这很有帮助。antonakos,atan2是正确的方法,但由于我使用的是lat/long坐标,这使问题变得更加困难。要发布代码,我将更新我上面的帖子以添加此轴承代码。谢谢你的帮助谢谢你的链接。你知道吗?角度是以度数表示的,还是以弧度表示的?角度是以度数表示的,其余的你在尝试后会很容易找到。很好,很简单的解决方案!此外,我的方位代码不起作用的一个原因是我使用的是纬度/经度坐标。我找到了一个简单的解决方法(我会更新我的帖子)。酷,我以后需要的时候会喜欢它。我看你已经找到Math.toDegrees()函数了——很高兴知道。你的atan2产生的角度是0-90还是0-360?我不得不在我的链接中手动调整。看起来我的角度从-180到180,这真的很容易。
private void rotateImage(ImageView imageView, double angle) {

    Matrix matrix = new Matrix();
    imageView.setScaleType(ScaleType.MATRIX); // required
    matrix.postRotate((float) angle, imageView.getDrawable().getBounds()
            .width() / 2, imageView.getDrawable().getBounds().height() / 2);
    imageView.setImageMatrix(matrix);
}