Вычислить точку на поверхности сплайна - PullRequest
3 голосов
/ 21 апреля 2011

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

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

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

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

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

1 Ответ

1 голос
/ 14 июня 2011

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

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

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

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

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

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

...