Как найти точку на b-сплайне, которая находится на нормальной плоскости точки на другом b-сплайне, используя goemdl / nurbs - PullRequest
0 голосов
/ 30 апреля 2020

Таким образом, первая проблема будет ясно объяснять, что я хочу.

У меня есть два нерациональных трехмерных b-сплайна. Первый b-сплайн это направляющий сплайн. Второй b-сплайн является ссылкой, и он по сути «внутри» первого сплайна. (сплайны были сгенерированы в Solidworks)

Представьте себе круглый слайд игровой площадки. Первый сплайн является центральной линией слайда. Второй сплайн является внутренним краем слайда.

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

Путь скольжения не является идеально круглым. Но сплайн внутри всегда «параллелен» внешней стороне. (очень либеральное использование слова «параллель» здесь)

Что я имею после :

Учитывая точку вдоль кривой center , я бы хотел чтобы найти точку на кривой внутри , которая находится на плоскости, определяемой нормали к касательной сплайна center в этой точке.

Где я нахожусь на : я использую библиотеку geomdl в python для управления сплайнами.

Я могу выбрать расстояние вдоль сплайна center и из geomdl я получаю 3D-точка и касательный вектор (A, B, C) этой точки и, следовательно, плоскость в этой точке, перпендикулярная сплайну в этой точке.

Что я делаю :

По касательному вектору и точке я вычисляю уравнение плоскости в виде: Ax + By + Cz = D.

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

[Я понимаю, что по всей длине двух сплайнов может быть больше чем одно решение. т.е. если кривая охватывает более 180 °, на внутренней кривой будет более одной точки, которая приземляется на плоскость, определяемую центральной кривой. В местном районе, который меня интересует, проблем не будет. Любая вторая точка также будет находиться далеко от центральной линии. т.е. правильная точка будет не более 25 мм от центральной точки. Нелокальная точка будет на расстоянии не менее 3000 мм. ]

Это в основном работает. Но время от времени это терпит неудачу. т.е. если D очень близко к 0, мои догадки будут отклоняться от ответа.

В настоящее время я делаю 10 догадок, каждая из которых имеет меньшую дельта-оценку, чем предыдущая.

У меня есть множество этих точек для оценки. Мое решение требует 10-кратного количества вычислений, поэтому оно не очень эффективно.

Из моих поисков в Google я считаю, что использование ошибки в D в уравнении плоскости может быть неправильным. Я «думаю», что D - это расстояние от плоскости до начала координат (да / нет?). Поэтому я действительно сравниваю расстояние двух плоскостей от начала координат, а не от друг друга. Если мое предположение окажется на «другой стороне» начала координат, тогда расстояние может быть таким же, но противоположным.

Мой вопрос : Как правильно указать go о это?

Является ли мое предположение, что D - это расстояние от плоскости до начала координат?

Действительна ли ошибка D в двух точках?

Что такое правильный способ сделать это?

Переформулируйте мой вопрос другими словами

Учитывая плоскость (Ax + By + Cz = D), как мне найти точку на заданный b-сплайн, который прокалывает (или совпадает с) эту плоскость (используя geomdl.bcurve)?

(я здесь очень сильно разбираюсь, поэтому, пожалуйста, простите, если это не имеет смысла)

...