Я хотел бы найти кривизну в заданной точке на трехмерном b-сплайне. Я считаю, что хочу использовать производные сплайна в этой точке для вычисления кривизны в этой точке, но я не понимаю, как это сделать.
Я определил 3D-сплайн (взятый из SolidWorks (откуда это не имеет значения)) в geomdl. Я могу оценить любую точку на сплайне, используя Curve.evaluate_single(). Похоже, это работает правильно. Я проверил возвращенные точки по модели SolidWorks, поэтому я предполагаю, что правильно реализовал bspline в nurbs.
Мне нужно найти радиус в различных точках вдоль этой кривой. Из моего поиска в 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) возвращает первые 4 производные кривой, а 0-я производная — это положение точки на кривой. Таким образом, первая производная [-2719.7097781710354, -598.8099790539873, -711.5032638750225], а вторая производная [-5384.519486543373, 1273.8662545231637, 19431.22021519]. Таким образом, мы можем использовать эти два вектора для наших вычислений и получить радиус кривизны 408,9176414, что близко к вашему оценочному значению 409.
Кстати, вы можете просто передать «3» в качестве второго аргумента функции Curve.derivatives(), поскольку вектор третьей производной не используется при вычислении радиуса кривизны.