2

Вопрос по c# – undefined

Я искал, но я не мог найти полный ответ. В C # если это вообще возможно. Мне нужно кратчайшее расстояние между точкой WGS и отрезком, определенным точкой WGS на сфере (точно на Земле).

float DistanceInKilometres(PointF LineStartA, PointF LineEndB, PointF ThePoint)

РЕДАКТИРОВАТЬ: Возможно, иллюстрация поможет

enter image description here

Обратите внимание, что это идеальный пример. «точка»; может быть где угодно на поверхности сферы, сегмент начала и конца тоже. Очевидно, я не ищу расстояние через сферу. Математика не моя сильная сторона, поэтому я не понимаюnormalize или жеto cartesian, Может быть, я также должен отметить, что путь AB - самый короткий из возможных, а расстояние? - тоже самый короткий из возможных.

  • Error: User Rate Limit Exceeded

    от JJ_Jason
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от JJ_Jason
  • Error: User Rate Limit Exceeded

    от JJ_Jason
  • Error: User Rate Limit Exceeded

    от JJ_Jason
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от JJ_Jason
  • @Nate Kohl И когда я сказал «я не смог найти полный ответ», именно это я и имел в виду.

    от JJ_Jason
  • Я удивлен, что ни у кого нет даже ссылки на возможное решение?

    от JJ_Jason
  • Это может быть идея бога, чтобы узнать эти вещи. Простой веб-поиск должен дать массу информации по этой теме.

    от Sam Axe
  • Связанные или дубликаты:stackoverflow.com/questions/1299567/…

    от Nate Kohl
  • напримерstackoverflow.com/questions/7803004/…

    от Nate Kohl
  • 0

    Если ваша точка находится в коридоре

    который определяется конечными точками вашего отрезка и перпендикулярно линии, то этоответ следует сделать.

    Если ваша точка лежит за пределами этого коридора, то рассчитайте расстояние от вашей точки до каждого конца отрезка и выберите меньшее.

  • 3

    Вы можете использовать сферический закон косинусов:

    http://en.wikipedia.org/wiki/Spherical_law_of_cosines http://mathworld.wolfram.com/SphericalSegment.html http://mathworld.wolfram.com/SphericalTrigonometry.html

    Вы должны будете использовать радиус Земли дл вычислений:

    EARTH_RADIUS_KM = 6371;

    Здесь, из моего вклада в OsmMercator.java, из openstreetmap.org:

    /**
     * Gets the distance using Spherical law of cosines.
     *
     * @param la1 the Latitude in degrees
     * @param lo1 the Longitude in degrees
     * @param la2 the Latitude from 2nd coordinate in degrees
     * @param lo2 the Longitude from 2nd coordinate in degrees
     * @return the distance
     */
    public static double getDistance(double la1, double lo1, double la2, double lo2) {
        double aStartLat = Math.toRadians(la1);
        double aStartLong = Math.toRadians(lo1);
        double aEndLat =Math.toRadians(la2);
        double aEndLong = Math.toRadians(lo2);
    
        double distance = Math.acos(Math.sin(aStartLat) * Math.sin(aEndLat)
                + Math.cos(aStartLat) * Math.cos(aEndLat)
                * Math.cos(aEndLong - aStartLong));
    
        return (EARTH_RADIUS_KM * distance);
    }
    

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

    Вот пример ближайшего пункта:

    double[] nearestPointSegment (double[] a, double[] b, double[] c)
    {
       double[] t= nearestPointGreatCircle(a,b,c);
       if (onSegment(a,b,t))
         return t;
       return (distance(a,c) < distance(b,c)) ? a : c;
    }
    
    How to calculate distance from a point to a line segment, on a sphere? http://en.wikipedia.org/wiki/Great-circle_distance

    Имейте в виду, что единицы не были явно объявлены. При работе с точками в космосе существует множество способов определения позиции. Главное, чтобы вам приходилось прибегать к единицам единообразного типа.

    Работая с положением на земле, я в основном использую координаты широты / долготы и векторы для величины / направления. Существует несколько известных типов, которые можно использовать для векторов и положения земли. Среди них есть следующие:

    Earth-centered earth-fixed (ECEF) coordinate system North-East-Down (NED) Geodetic coordinate system

    Для вашего примера, я мог бы рассмотреть возможность придерживаться геодезического.

    Теперь, собрав это вместе, вы можете получить псевдокод, который выглядит следующим образом:

    Where a Vector is made up of Geodetic coordinates:
    class Vector {
     double x=0.0; //latitude
     double y=0.0; //longitude
     double h=0.0; //height
    ...
    }
    
    public Vector closestPoint(Vector lineStartA, Vector lineEndB, final Vector thePoint ) {
        Vector w = thePoint.subtract(lineStartA);
        double proj = w.dot(lineEndB);
        // endpoint 0 is closest point
        if ( proj <= 0.0f )
            return lineStartA;
        else
        {
            //Vector square 
            double vsq = lineEndB.dot(lineEndB);
            // endpoint 1 is closest point
            if ( proj >= vsq )
                return lineStartA.add(lineEndB);
            else
                return lineStartA.add(lineEndB.multiply(proj/vsq));
        }
    }      
    
    double DistanceInKilometres(Vector lineStartA, Vector lineEndB, Vector thePoint) {
      Vector cp=closestPoint(lineStartA, lineEndB, thePoint);
      return getDistance(cp.x, cp.y, thePoint.x, thePoint.y);
    }