找到多段线给定点的切线

Finding the tangent on a given point of a polyline

我有一个代表道路的 X、Y 坐标列表。对于每 5 米,我需要计算这条道路上的切线角度,正如我在图片中尝试说明的那样。

我的问题是这条路不是用我可以简单推导的数学函数表示的,而是用坐标列表 (UTM33N) 表示的。

在我的其他类似项目中,我们使用 ArcGIS/ESRI 库来执行诸如此类的地理功能,但在这个项目中,我需要独立于任何需要最终用户拥有许可证的软件,所以我需要自己做计算(或者找一个可以做的free/open源库)。

我正在使用三次样条函数使坐标之间的线变圆,因为线段上的所有切线否则将与线段平行。

但现在我卡住了。我正在考虑简单地计算直线上任意三点之间的角度(给定足够的点),并使用它来找到切线,但这听起来不是一个好方法。有什么建议吗?

最后,我得出结论,这些点足够多,可以使用简单的几何图形给出准确的角度:

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