0

Я пытаюсь создать стрелку, указывающую на конкретную координату, как компас. Я использую Sensor.TYPE_ACCELEROMETER и Sensor.TYPE_MAGNETIC_FIELD от телефона, чтобы вычислить угол азимута (я взял ссылку из этого вопроса Using orientation sensor to point towards a specific location):Android, использующий RotateAnimation, указывающий на конкретное местоположение

 //calculate RotationMatrix 
     if (gravity != null && geomag != null) { 

      boolean success = SensorManager.getRotationMatrix(inR, I, 
           gravity, geomag); 
       if (success) { 
       SensorManager.getOrientation(inR, orientVals); 
       azimuth = Math.toDegrees(orientVals[0]); 
       pitch = Math.toDegrees(orientVals[1]); 
       roll = Math.toDegrees(orientVals[2]); 
       } 
     } 

     azimuth += geomagneticField.getDeclination(); 
     //azimuth = Math.round(sensorEvent.values[0]); 
     float bearing = lastLocation.bearingTo(targetLocation); 
     float angle = (float) azimuth + bearing; 

я затем использовать RotatateAnimation для создания вращения самой стрелки:

//the +90 below is because the ImageView arrow is pointing towards left by default 
RotateAnimation animation = new RotateAnimation(
       -(angle+90), 
       -(angle+90), 
       Animation.RELATIVE_TO_SELF, 0.5f, 
       Animation.RELATIVE_TO_SELF, 
       0.5f); 

Тем не менее, я проверил четыре разных целевых местоположения каждый в направлениях северо-восток на юг и на запад, стрелка только правильно указала в направлении восточного запада. В случае местоположений в направлении север и юг стрелка поворачивается на 180 градусов, а это означает, что она будет направлена ​​в противоположном направлении. Если я добавлю 180 градусов к вращению, стрелка будет правильно указывать на места на севере или на юге, но тогда места с востока и запада будут неправильными. Это действительно расстраивает, и для меня это совершенно не имеет смысла.

Я был бы действительно благодарен, если бы кто-нибудь мог мне помочь! Заранее спасибо!

ответ

0

Я сделал некоторые дополнительные тесты и понял, что диапазон от подшипника и азимутальные углы каждый (0 ... 180, -180 ... 0) происходит по часовой стрелке, а начиная с 0, в то время как RotateAnimation принимает углы от 0 ... 360 по часовой стрелке. Поэтому я просто преобразовал азимут и углы несущей, добавив 360, если они были меньше 0, прежде чем я приступил к вычислениям.