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