使用 geomdl / nurbs 在 bspline 上的一个点找到半径(或曲率)

Find the radius ( or curvature ) at a point on a bspline using geomdl / nurbs

我想找到 3D b 样条曲线上给定点的曲率。 我相信我想使用样条曲线在该点的导数来计算该点的曲率,但我不明白如何。

我在 geomdl 中定义了一个 3D bspline(取自 SolidWorks(它来自哪里不相关))。我可以使用 Curve.evaluate_single() 评估样条曲线上的任何点。这似乎工作正常。我已经根据 SolidWorks 模型验证了返回的点,所以我假设我已经正确地在 nurbs 中实现了 bspline。

我需要找到这条曲线上不同点的半径。根据我的 Google 搜索,我认为我想使用 Curve.derivatives() 来计算该点的瞬时曲率。但是我不明白如何将 Curve.derivatives() 的结果变成半径。

下面是 Curve.derivatives(SomePointOnPath,4) 的结果:

[   [74.66019681782404, 131.77035668055586, 19.88498274391211],
    [-2719.7097781710354, -598.8099790539873, -711.5032638750225],
    [-5384.519486543373, 1273.8662545231637, 19431.220551950217],
    [93757.48746982217, -22247.397114396095, 31343.52746776864],
    [0.0, 0.0, 0.0]]

通过在该点两侧各取一小步,我计算出该点的半径约为 409(求解给定 3 个点的圆的半径)

我不明白 Curve.derivatives() 的结果告诉我什么。 (第一个元组是点的坐标,超出我就迷路了)

我预计这个特定点的半径约为 409。

我的基本问题分为两部分:

结果告诉我什么。它们是什么意思。

如何使用这些结果来计算此时的半径。

曲线的曲率半径可以计算为 |C'|^3/|C' X C"| 其中 C' 和 C" 是一阶和二阶导数向量,X 是叉积运算符和|。|是向量的大小。因此,您将需要该点的一阶和二阶导数来计算曲率半径。

Curve.derivatives(SomePointOnPath,4) returns曲线的前4个导数,第0个导数就是点在曲线上的位置。因此,一阶导数为 [-2719.7097781710354, -598.8099790539873, -711.5032638750225],二阶导数为 [-5384.519486543373, 1273.8662545231637, 19431.2202571].5因此,我们可以使用这两个向量进行计算并获得曲率半径 408.9176414,这接近于您的估计值 409。

附带说明一下,您可以简单地将“3”作为第二个参数传递给 Curve.derivatives(),因为第三导数向量在计算曲率半径时没有用处。