Нахождение касательной к заданной точке полилинии

#coordinates #esri #polyline

#координаты #esri #полилиния

Вопрос:

У меня есть список координат X, Y, который представляет дорогу. Для каждых 5 метров мне нужно вычислить угол касательной на этой дороге, как я попытался проиллюстрировать на изображении.касательные дороги

Моя проблема в том, что эта дорога не представлена математической функцией, которую я могу просто вывести, она представлена списком координат (UTM33N).

В других моих подобных проектах мы используем библиотеки ArcGIS / ESRI для выполнения подобных географических функций, но в этом проекте мне нужно быть независимым от любого программного обеспечения, которое требует наличия лицензии у конечного пользователя, поэтому мне нужно выполнить вычисления самостоятельно (или найти бесплатную библиотеку с открытым исходным кодом, которая можетсделай это).

Я использую функцию кубического сплайна, чтобы сделать линию округленной между координатами, поскольку в противном случае все касательные на отрезке линии были бы просто параллельны сегменту.

Но теперь я застрял. Я рассматриваю возможность простого вычисления угла между любыми тремя точками на линии (при наличии достаточного количества точек) и использования этого для нахождения касательных, но это не похоже на хороший метод. Есть предложения?

Комментарии:

1. Это может быть глупым комментарием, но… как насчет получения кубического сплайна? Или интерполируйте сплайн, чтобы извлечь больше точек XY (и получить более точную полигональную цепочку, поэтому вы можете предположить, что небольшой сегмент этой цепочки довольно параллелен касательной в средней точке сегмента). Может быть, вы можете опубликовать свой кубический сплайн.

2. Да, это может быть возможным решением. Однако сейчас я склоняюсь к простому вычислению углов между тремя точками, поскольку функция сплайна возвращает гладкую линию. Это функция сплайна, которую я использую: codeproject.com/Articles/560163 /…

Ответ №1:

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

         //Calculate delta values
        var dx = next.X - curr.X;
        var dy = next.Y - curr.Y;
        var dz = next.Z - curr.Z;

        //Calculate horizontal and 3D length of this segment.
        var hLength = Math.Sqrt(dx * dx   dy * dy);
        var length = Math.Sqrt(hLength * hLength   dz * dz);

        //Calculate horizontal and vertical angles.
        hAngle = Math.Atan(dy/dx);
        vAngle = Math.Atan(dz/hLength);