binomialCoeffs (nCtrlPts - 1, C); for (k = 0; k <= nBezCurvePts; k++) {
u = GLfloat (k) / GLfloat (nBezCurvePts); computeBezPt (u, SbezCurvePt, nCtrlPts, ctrlPts, C); plotPoint (bezCurvePt);
}
delete [ ] C;
}
void displayFcn (void)
{
/* Задается число контрольных точек и число точек
* кривой, изображаемых на кривой Безье.
*/
GLint nCtrlPts = 4, nBezCurvePts = 1000; wcPt3D ctrlPts [4] = { {-40.0, -40.0, 0.0},
{-10.0, 200.0, 0.0}, {10.0, -200.0, 0.0}, {40.0, 40.0, 0.0} }; glClear (GL_COLOR_BUFFER_BIT);
/* Очищается окно на экране дисплея. */
glPointSize (4);
glColor3f (1.0, 0.0, 0.0); // Цвет точек выбран красным,
bezier (ctrlPts, nCtrlPts, nBezCurvePts); glFlush ( );
}
void winReshapeFcn (GLint newWidth, GLint newHeight)
{
/* Характеристическое отношение поддерживается равным 1. */ glViewport (0, 0, newHeight, newHeight); glMatrixMode (GL_PROJECTION); glLoadldentity ( );
gluOrtho2D (xwcMin, xwcMax, ywcMin, ywcMax); glClear (GL_COLOR_BUFFER_BIT);
}
void main (int argc, char** argv)
{
glutlnit (&argc,> argv);
glutlnitDisplayMode (GLUT_SINGLE | GLUT_RGB); glutlnitWindowPosition (50, 50); glutlnitWindowSize (winWidth, winHeight); glutCreateWindow ("Кривая Безье");
init ( ) ;
glutDisplayFunc (displayFcn); glutReshapeFunc (winReshapeFcn);
glutMainLoop ( );
}
МЕТОДЫ ПРОЕКТИРОВАНИЯ С ИСПОЛЬЗОВАНИЕМ КРИВЫХ БЕЗЬЕ
Чтобы сгенерировать замкнутую кривую Безье, положение последней контрольной точки выбирается равным положению первой, как в примере, показанном на рис. 8.35. Кроме того, ввод нескольких контрольных точек с одинаковыми координатами равносильно присвоению большего весового коэффициента этой точке. На рис. 8.36 введены две одинаковые контрольные точки, и видно, что получающаяся кривая притягивается к этой точке.
БИ-СПЛАЙНЫ
Данная категория сплайнов является наиболее используемой, и функции би-сплайнов широко применяются в системах автоматизированного проектирования и многих пакетах графического программирования. Подобно сплайнам Безье, би-сплайны генерируются путем аппроксимации набора контрольных точек. В то же время, би-сплайны обладают двумя преимуществами по сравнению со сплайнами Безье: во-первых, степень полинома би-сплайна можно задать независимо от числа контрольных точек (с определенными ограничениями), во-вторых, би-сплайны допускают локальный контроль над формой кривой. Платой за этой является большая сложность би-сплайнов по сравнению со сплайнами Безье.
РАЦИОНАЛЬНЫЕ СПЛАЙНЫ
Рациональные сплайны имеют два важных преимущества перед нерациональными. Во-первых, они точно представляют кривые второго порядка (конические сечения), такие как окружности и эллипсы. Нерациональные сплайны (полиномы) могут только аппроксимировать конические сечения. Эта возможность позволяет графическим пакетам моделировать все формы кривых с помощью одного представления (рациональных сплайнов), не требуя для обработки различных форм большой библиотеки криволинейных функций. Второе преимущество рациональных сплайнов заключается в том, что они инвариантны относительно перспективной проекции (раздел 7.8). Это означает, что перспективное преобразование можно применять к контрольным точкам рациональной кривой, и получится правильная проекция кривой. С другой стороны, нерациональные сплайны, не инвариантны относительно перспективной проекции. Поэтому обычно в проектах графической разработки для построения рациональных би-сплайнов используются неравномерные представления вектора узлов. Данные сплайны называются “NURBS” (Nonuniform Rational B-splines - неравномерные рациональные би-сплайны).