Рисование кривых NURBS?

на прошлой неделе я столкнулся с этой проблемой. Для моего текущего проекта мне нужно рисовать кривые NURBS, проект уже использует OpenNURBS, но я не смог понять, как его использовать.

Мой вопрос: как я могу получить точки кривой из нескольких контрольных точек?

Я провел немало поисков и увидел этот веб-сайт: http://www.nar-associates.com/nurbs/c_code.html

Я могу использовать код, но я не понимаю, как его расширить/упростить, чтобы использовать N контрольных точек.

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


person Ilija Boshkov    schedule 07.08.2012    source источник


Ответы (3)


попробуйте эту библиотеку:

http://libnurbs.sourceforge.net/

Кривые и поверхность неоднородных рациональных B-сплайнов (NURBS) — это очень общие математические поверхности, широко используемые для представления сложных трехмерных форм в компьютерной графике.

Цель libnurbs — предоставить чистую, надежную и мощную библиотеку с возможностью определять, манипулировать и анализировать кривые и поверхности NURBS. Мы будем опираться на основу, предоставляемую библиотекой openNURBS, реализовывать отсутствующие в этой библиотеке функции и вносить изменения по мере необходимости. Целью усилий openNURBS является повышение совместимости между различными CAD-системами, поэтому у них нет стимула разрабатывать или выпускать более полнофункциональную библиотеку (это Rhino, их коммерческая платформа) — отсюда и необходимость в этом проекте.

person Tutankhamen    schedule 07.08.2012
comment
Я попробую это и доложу. Я загружал это несколько раз, но я не читал примеры полностью. - person Ilija Boshkov; 07.08.2012
comment
Нет, эту штуку совершенно невозможно скомпилировать, я получаю тысячи ошибок каждый раз, когда пытаюсь ее скомпилировать, она устарела и не подлежит ремонту. - person Ilija Boshkov; 08.08.2012
comment
Может ты что-то не так делаешь.. Что за ошибка у тебя? - person Tutankhamen; 08.08.2012

Вы можете нарисовать NURBS-кривую онлайн с помощью этого бесплатного инструмента . Это приложение на основе WebGL и лучше всего работает в браузере Chrome. Здесь вы можете рисовать кривые с N контрольными точками и видеть значение точки на кривой, соответствующей параметру u.

person splineducks    schedule 10.05.2016

Вот как я это делаю

  1. сделать кривую

а. создать объект кривой (размер, рациональный флаг (есть ли у него веса), степень кривой +1, сколько у вас контрольных точек)

 ON_NurbsCurve thisCurve(3, false, order, controlPoints.size());

б. добавить контрольные точки на кривую

for(int i = 0; i <controlPoints.size(); ++i)
{
   ON_3dPoint cpPosition = controlPoints[i];
   thisCurve.SetCV(i, cpPosition.x);
}

в. добавить узлы

I. если у вас есть node_count = cv_count + степень + 1

for (int i = 1; i < knotValues.size() - 1; ++i)
   thisCurve.SetKnot(i - 1, knotValues[i]);

II. Если у вас есть node_count = cv_count + степень - 1

for (int i = 0; i < knotValues.size(); ++i)
   thisCurve.SetKnot(i, knotValues[i]);
  1. Попробуйте кривую

а. проверьте, действительна ли кривая

if (thisCurve.IsValid())
{

б. получить параметрический диапазон кривой

double maxU = knotValues.back();
double minU = knotValues.front();

в. интерполировать

double quadrature = 10;
for (unsigned int i = 0; i < quadrature; ++i)
{
  double t = ((maxU - minU) * (i) / (quadrature - 1)) + minU;
  double pointsOut[3];

д. оценить это принимает (параметр кривой, сколько взято производных, какое измерение, двойной массив для хранения значений)

  bool successful = thisCurve.Evaluate(t, 0, 3, pointsOut);
  if (successful)
    curvePoints.push_back(ON_3dPoint(pointsOut[0], pointsOut[1], pointsOut[2]));
  else
    std::cout << "evaluation not successful " << std::endl;

е. очистить

  delete [] pointsOut;
}

thisCurve.Destroy();
person brettmichaelgreen    schedule 28.09.2016