Как подогнать ось и радиус 3D цилиндра?

Как только я получу координаты трехмерной точки, какой алгоритм мне использовать, чтобы подобрать оптимальный цилиндр и получить вектор направления и радиус центральной оси?

Как подогнать ось и радиус 3D цилиндра?

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

Добро пожаловать в SO, не могли бы вы предоставить набор данных в виде ссылки (без снимка экрана).

jlandercy 06.05.2024 09:40

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

Community 06.05.2024 10:33

Ваша выставка представляет собой оптическую иллюзию.

Cary Swoveland 06.05.2024 17:33
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
3
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вот ось MCVE для регрессии, определяемая p0 и p1 (векторами) и радиусом R (скаляром).

Сначала мы создаем фиктивный набор данных:

import numpy as np
import matplotlib.pyplot as plt
from scipy import optimize
from scipy.spatial.transform import Rotation

def cylinder(n=60, m=20, r=2, h=5):
    t = np.linspace(0, m * 2 * np.pi, m * n)
    z = np.linspace(0, h, m * n)
    x = r * np.cos(t)
    y = r * np.sin(t)
    return np.stack([x, y, z]).T

X = cylinder()
rot = Rotation.from_rotvec(np.array([-1, 2, 0.5]))
x0 = np.array([1., 2., 0.])
    
X = rot.apply(X)
X = X + x0

Это создает общий вариант использования, включая сдвиг происхождения.

Теперь достаточно записать геометрическое уравнение (см. уравнение 10) в виде остатков и минимизировать его по методу наименьших квадратов.

def residuals(p, xyz):
    return np.power(np.linalg.norm(np.cross((xyz - p[0:3]), (xyz - p[3:6])), axis=1) / np.linalg.norm((p[3:6] - p[0:3])), 2) - p[6] ** 2

p, res = optimize.leastsq(residuals, x0=[0., 0., 0., 1., 1., 1., 0.], args=(X,), full_output=False)

Что в данном случае возвращает:

# array([ -1.8283916 ,  -1.65918186,   3.29901757,  # p0
#         20.31455462,  26.98786514, -22.52837088,  # p1
#          2.        ])                             # R

Графически это приводит к:

Другие вопросы по теме