Нужен сектор, основанный на азимуте, геопозиции, расстоянии и угле

У меня проблема. Я пытаюсь написатьДЖАВА код был в данподшипник, (широта, долгота), скорость Мне нужно получить все точки, которые образуют сектор (как на диаграмме (x1, y1), (x2, y2) и список точек, которые образуютдуга в направлении, которое дается подшипником (у меня очень ограниченные знания о подшипнике).

Первое, что я хочу сделать, - это создать сектор, основанный на направлении с жестко заданным расстоянием и углом. (т.е. фиксированные значения говорятd = 5km а такжеangle = 60 deg.)

Следующий шаг основан на скорости, я хочу расстояниеd а такжеangle рассчитываться какd = func(speed) а такжеangle = func(speed) но это будет позже.

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

Поправь меня, если я ошибаюсь в своей теории / объяснении. Пожалуйста, мне нужна помощь, ребята .....

Больше деталей:

Я работаю над небольшим проектом, который отслеживался через карты Google на телефоне.(lat,lon) - current position of user, bearing - in the direction in which I am headed а такжеspeed - what speed i am travelling.

Отношение расстояния и угла к скорости:

Если я путешествую с большей скоростью,d должно быть больше иangle должно быть меньше (дуга будет уже)

Если я путешествую с меньшей скоростью, тоd должно быть меньше и `угол должен быть больше (дуга будет шире)

Если я неподвижен, скорость0 тогда я нарисую круг вокруг моего тока(lat,lon) и найти мои POI вокруг меня.

Как только я получу этот сектор, я буду использовать Elastic search (он предоставляет некоторые функции (), такие как поиск по соседству и поиск по полигонам), чтобы получить все интересные места на моем пути, пока я отслеживаю

В конечном счете, пока я за рулем, я хочу показать пользователю, какие POI он получает на своем пути. (мы не знаем пункт назначения пользователя)

ОБНОВИТЬ
public class Test {

    // N is the number of points on the arc
    // e.g. const int N = 15;
    private static final int N = 10;

    public static void main(String[] args){

        final double deg2Rad = Math.PI / 180.0; //degree to Radian
        final double Rad2deg = 180.0 / Math.PI; //Radian to degree
        double bearing =  90; //direction
        double angle = 60; //sector angle   
        double R = 6371.0; //Radius of earth

        double lat = 12.926428 * deg2Rad;
        double lon = 77.677705 * deg2Rad;

        double d = 5; 

        Geopoint[] array = new Geopoint[N];

        double A = bearing - angle * 0.5;    // starting angle / bearing
        double dA = angle / (double)(N - 1); // angle step between adjacent points

        /* convert lat, lon to cartesian here! */
        double  x = R * Math.cos(lat) * Math.cos(lon);
        System.out.println(x);
        double  y = R * Math.cos(lat) * Math.sin(lon);
        System.out.println(y);
        double  z = R * Math.sin(lat);
        System.out.println(z);


        for (int i = 0; i < N; i++, A += dA)
        {
          double c = Math.cos(A * deg2Rad), 
                 s = Math.sin(A * deg2Rad);

          System.out.println( "C : " + c);
          System.out.println( "S : " + s);

          double x1 = (x + d * c) ;

          double y1 = (y + d * s) ;

          //Convert back to Geopoint
          lat = Math.asin(z / R) * Rad2deg;
          lon = Math.atan2(y1, x1) * Rad2deg;

          array[i] = new Geopoint(lon , lat );
        }

        // return array 
        for ( int i = 0; i < array.length; i++ )
            System.out.println("points," + i + "," + array[i]); 
    }

}

Для приведенного выше кода я получаю ниже вывод

Выход

points,0,{ "lon":130.56759538189806, "lat":20.62976857973366, "geoadress":"null" }
points,1,{ "lon":130.56753333442796, "lat":20.62976857973366, "geoadress":"null" }
points,2,{ "lon":130.56747144031073, "lat":20.62976857973366, "geoadress":"null" }
points,3,{ "lon":130.56740969980146, "lat":20.62976857973366, "geoadress":"null" }
points,4,{ "lon":130.5673481131545, "lat":20.62976857973366, "geoadress":"null" }
points,5,{ "lon":130.5672866806237, "lat":20.62976857973366, "geoadress":"null" }
points,6,{ "lon":130.5672254024622, "lat":20.62976857973366, "geoadress":"null" }
points,7,{ "lon":130.5671642789225, "lat":20.62976857973366, "geoadress":"null" }
points,8,{ "lon":130.5671033102564, "lat":20.62976857973366, "geoadress":"null" }
points,9,{ "lon":130.56704249671517, "lat":20.62976857973366, "geoadress":"null" }

Но этот вывод неверен. Я не знаю, где я иду не так.

Выход

После измененияlat а такжеlon в радианах это мой результат.

points,0,12.926428,77.677705
points,1,12.926428,77.6917252889466
points,2,12.926428,77.68652371253442
points,3,12.926428,77.68120259629767
points,4,12.926428,77.67583406750569
points,5,12.926428,77.67049090073982
points,6,12.926428,77.6652455243131
points,7,12.926428,77.6601690315512
points,8,12.926428,77.65533021080672
points,9,12.926428,77.65079460778875
points,10,12.926428,77.64662363329005

Так как я это донгlat = Math.asin(z / R) * Rad2deg; для преобразования из декартовой я получаю все то же самое. Я не знаю, как это решить.

Resut

На основеiant код

Result_1 #

Я вычислил расстояние между прочим(lat,lon) в каждую точку на дуге. Это должно привести к тому же расстоянию.iant проверьте результат, есть небольшие различия в расстоянии.

type,id,lat,lon points,1,12.926428,77.677705 Distance in mtrs : 0.0 points,2,12.92657150782396,77.67778916970093 Distance in mtrs : 9.971162660481445 points,3,12.926578367173896,77.67778862221844 Distance in mtrs : 9.971162660481445 points,4,12.926585180719618,77.67778804926368 Distance in mtrs : 9.971162660481445 points,5,12.926591946385617,77.67778745101116 Distance in mtrs : 9.97070966260917 points,6,12.92659866211097,77.67778682764309 Distance in mtrs : 9.971162660481445 points,7,12.926605325849975,77.6777861793494 Distance in mtrs : 9.971162660481445 points,8,12.926611935572756,77.67778550632754 Distance in mtrs : 9.97070966260917 points,9,12.926618489265902,77.67778480878253 Distance in mtrs : 9.97070966260917 points,10,12.92662498493306,77.67778408692685 Distance in mtrs : 9.971162660481445 points,11,12.926631420595564,77.67778334098041 Distance in mtrs : 9.97070966260917 points,12,12.926637794293018,77.67778257117044 Distance in mtrs : 9.97070966260917 points,13,12.926644104083913,77.67778177773138 Distance in mtrs : 9.97070966260917 points,14,12.9266503480462,77.67778096090498 Distance in mtrs : 9.97070966260917 points,15,12.926656524277885,77.67778012094006 Distance in mtrs : 9.970256644154967 points,16,12.926662630897608,77.67777925809244 Distance in mtrs : 9.970256644154967 points,17,12.926668666045215,77.67777837262499 Distance in mtrs : 9.97070966260917 points,18,12.926674627882324,77.67777746480742 Distance in mtrs : 9.97070966260917 points,19,12.92668051459289,77.67777653491626 Distance in mtrs : 9.970256644154967 points,20,12.926686324383741,77.6777755832348 Distance in mtrs : 9.970256644154967 points,21,12.926692055485155,77.67777461005294 Distance in mtrs : 9.970256644154967 points,22,12.926428,77.677705 Distance in mtrs : 0.0

Расчет расстояния
public static double distanceOf(Geopoint a, Geopoint b) {
    if (a.isValid() && b.isValid()) {
      double distFactor = Math.acos(Math.sin(Math.toRadians(a.getLat())) * Math.sin(Math.toRadians(b.getLat()))
          + Math.cos(Math.toRadians(a.getLat())) * Math.cos(Math.toRadians(b.getLat()))
              * Math.cos(Math.toRadians(b.getLon()) - Math.toRadians(a.getLon())));
      return 6378.388 * distFactor;
    }
    return -1;
  }

Ответы на вопрос(3)

Ваш ответ на вопрос