Повернуть матрицу для растрового изображения — Android

У меня есть пользовательская карта (холст), на которой я рисую указатель карты. Я обновляю его в своем методе 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);
  }

}

...

Paint p = new Paint();
Matrix matrix = new Matrix();
matrix.postRotate(bearing, coords.x, coords.y);
Bitmap rotatedImage = Bitmap.createBitmap(image, 0, 0, image.getWidth(), 
                                          image.getHeight(), matrix, true);
canvas.drawBitmap(rotatedImage, x-image.getWidth()/2, y-image.getHeight()/2, p);

Редактировать:

Использование координат широты и долготы для определения пеленга сложнее, чем просто между двумя точками. Однако этот код (измененный из кода, найденного здесь) работает хорошо:

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));
}

person Phil    schedule 23.05.2011    source источник


Ответы (3)


Вот как повернуть растровое изображение: -its/6004218#6004218">Android: как повернуть движущийся анимированный спрайт на основе координат пункта назначения

person Lumis    schedule 24.05.2011
comment
Спасибо за ссылку. Вы знаете - это угол в градусах к востоку от севера или в радианах (или что-то еще)? - person Phil; 24.05.2011
comment
Угол указан в градусах, остальное вы легко найдете после того, как попробуете. - person Lumis; 24.05.2011
comment
Отличное, простое решение! Кроме того, одна из причин, по которой мой код азимута не работает, заключается в том, что я работаю с координатами широты/долготы. Я нашел простое решение для этого (я обновлю свой пост). - person Phil; 24.05.2011
comment
Круто, я должен добавить это в избранное на потом, когда мне это понадобится. Я вижу, вы нашли функцию Math.toDegrees() - полезно знать. Ваш atan2 выдает углы от 0-90 или 0-360? Мне пришлось настроить это вручную в моей ссылке. - person Lumis; 24.05.2011
comment
Похоже, мои углы варьируются от -180 до 180, что действительно упрощает задачу. - person Phil; 25.05.2011
comment
Отлично, в таком случае atan2 — это закон! :) - person Lumis; 25.05.2011

Чтобы правильно вычислить угол с минимумом возни и деления на ноль рисков, 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.

person antonakos    schedule 23.05.2011
comment
Спасибо за ответ. Мне было интересно, как использовать atan2, так что это было очень полезно. - person Phil; 24.05.2011
comment
Антонакос, atan2 - правильный способ сделать это, но, поскольку я использую координаты широты и долготы, это усложнило проблему. Чтобы опубликовать код, я обновлю свой пост выше, чтобы добавить этот код подшипника. Спасибо за вашу помощь - person Phil; 24.05.2011

если вы хотите повернуть 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);
}
person Nayanesh Gupte    schedule 11.09.2013