Рисование NURBS Кривых?
На прошлой неделе я столкнулся с этой проблемой. Для моего текущего проекта мне нужно нарисовать NURBS-кривые, проект уже использует OpenNURBS, но я не смог понять, как его использовать.
У меня вопрос, как я могу получить точки кривой из нескольких контрольных точек?
Я провел немало поисков и увидел этот сайт: http://www.nar-associates.com/nurbs/c_code.html
Я могу использовать код, но я не понимаю, как его расширить / упростить, чтобы использовать N контрольных точек.
(Кроме того, я использую C++, поэтому я преобразовал код со страницы в указанный язык, ответы, специфичные для C++, были бы лучше, но у меня нет проблем с преобразованием между языками.)
3 ответа
Вы можете нарисовать кривую NURBS онлайн с помощью этого бесплатного инструмента. Это приложение на основе webGL и лучше всего работает в браузере Chrome. Здесь вы можете нарисовать кривые с количеством контрольных точек N и увидеть значение точки на кривой, соответствующей параметру au.
Попробуйте эту библиотеку:
http://libnurbs.sourceforge.net/
Неравномерные кривые и поверхность Rational B-Splines (NURBS) - это очень общие математические поверхности, широко используемые для представления сложных трехмерных фигур в компьютерной графике.
Цель libnurbs - предоставить чистую, надежную и мощную библиотеку, способную определять, манипулировать и анализировать кривые и поверхности NURBS. Мы будем опираться на фундамент, предоставляемый библиотекой openNURBS, реализуя функции, отсутствующие в этой библиотеке, и внося изменения по мере необходимости. Целью усилий openNURBS является повышение взаимодействия между различными CAD-системами, поэтому у них нет стимула разрабатывать или выпускать более полнофункциональную библиотеку (это Rhino, их коммерческая платформа) - отсюда и необходимость в этом проекте.
Вот как я это делаю
- сделать кривую
а. создать объект кривой (размерность, рациональный флаг (имеет ли он вес), степень кривой +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. если у вас есть knot_count = cv_count + степень + 1
for (int i = 1; i < knotValues.size() - 1; ++i)
thisCurve.SetKnot(i - 1, knotValues[i]);
II. Если у вас есть knot_count = cv_count + Степень - 1
for (int i = 0; i < knotValues.size(); ++i)
thisCurve.SetKnot(i, knotValues[i]);
- Пример кривой
а. проверьте правильность кривой
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();