Вычислить точку на поверхности сплайна

Я работаю над алгоритмом управления, который будет работать на встроенной системе. Мой язык программирования - C, и система будет довольно сильно ограничена с точки зрения памяти и вычислительной мощности.

У меня есть несколько (порядка 10) опорных точек в трехмерном пространстве. Обычно они статичны, но время от времени меняются. Я хотел бы подогнать поверхность сплайна так, чтобы она проходила через все эти точки, а затем иметь функцию, которая для заданного входного вектора (x, z) возвращает расстояние y от плоскости y = 0.

Я думаю, что это проблема, которая должна быть решена в двух частях: 1) некоторые новые коэффициенты будут вычисляться всякий раз, когда изменяется контрольная точка, и 2) коэффициенты вставляются в функцию, которая возвращает y для заданного (x, z). (Только 2 должно происходить в режиме реального времени.)

Я немного исследовал в сети это, но мне трудно с математикой, и большая часть материала относится к компьютерной графике. Я даже не уверен, какой тип сплайна мне нужен; NURBS и Catmull-Rom оба кажутся актуальными. И наконец, что касается формы краев моего сплайна: поскольку мои входные векторы взяты из хорошо ограниченных показаний датчика, мне действительно все равно, что делает сплайн за пределами этой границы.

Я был бы очень благодарен за некоторую помощь или указатели на соответствующий материал, и любые фрагменты псевдокода были бы очень признательны.

1 ответ

Если бы вы могли каким-то образом генерировать треугольники Безье при изменении ваших опорных точек, гладкую поверхность этих треугольников легко рассчитать даже при ограниченных ресурсах вашего микроконтроллера - для этого требуется только повторное сложение и деление на два.

Один из способов создания треугольников Безье, которые проходят через все ваши точки, состоит в том, чтобы использовать триангуляцию Делоне на ваших контрольных точках, чтобы найти группу треугольников, которые покрывают вашу поверхность. Затем используйте углы этих треугольников в качестве углов ваших треугольников Безье и произвольно выбирайте контрольные точки так, чтобы грань между соседними треугольниками была "гладкой" (а не "согнутой").

Один из возможных способов выбора этих контрольных точек:

Для каждой из угловых точек треугольника (т. Е. Каждой из ваших исходных опорных точек):

  • найти все края треугольника, где один конец в этой угловой точке
  • найти все точки, "соединенные" с этой угловой точкой (на другом конце этих ребер)
  • установить плоскую плоскость, которая проходит через эту угловую точку, а наименьшие средние квадраты "приближаются" к соединенным точкам
  • Для каждого ребра выберите точку 1/4 (или 1/3 или 1/10 или что-то еще) от заданной угловой точки к соединенной угловой точке. Забудьте эту точку после нахождения ближайшей точки на плоскости к этой точке. Используйте полученную точку в качестве одной из контрольных точек в двух треугольниках, которые граничат с этим краем.

Это дает все, кроме одной контрольной точки для каждого треугольника Безье. Для оставшейся центральной контрольной точки треугольника Безье, возможно, проще всего использовать среднее геометрическое (центроид) угловых точек.

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