Untitled
unknown
plain_text
2 years ago
3.1 kB
10
Indexable
#include <GL/glut.h>
GLUnurbsObj* theNurb;
// массив точек определяющего многоугольника
const int ctlLen = 3;
GLfloat originalCarray[][4] = { {-1.0, -0.7, 0.0,1.0},
{-0.5, 0.7, 0.0,1.0},
{0.0, -0.7, 0.0,1.0},
{0.5, 0.7, 0.0,1.0}};
GLfloat ctlarray[][4] = { {-1.0, -0.7, 0.0,1.0},
{-0.5, 0.7, 0.0,1.0},
{0.0, -0.7, 0.0,1.0},
{0.5, 0.7, 0.0,1.0} };
void init(void)
{
glClearColor(1.0, 1.0, 1.0, 1);
// gluNewNurbsRenderer – создает NURBS объект
theNurb = gluNewNurbsRenderer();
// установка свойства неравномерного рационального B-сплайна
gluNurbsProperty(theNurb, GLU_SAMPLING_TOLERANCE, 25.0);
}
void Display()
{
// Массив, содержащий значения открытого равномерного узлового вектора
GLfloat knot[] = { 0.0,0.0,0.0,1.0,2.0,3.0,3.0,3.0 };
GLfloat knot1[] = { 0.0,0.0,1.0,2.0,3.0,4.0,4.0 };
glClear(GL_COLOR_BUFFER_BIT);
glLineWidth(1.0);
glPointSize(5.0);
glColor3f(0.0, 0.5, 1.0);
glBegin(GL_POINTS);
for (int i = 0; i < ctlLen; i++) {
glVertex3f(originalCarray[i][0], originalCarray[i][1], originalCarray[i][2]);
}
glEnd();
gluNurbsCurve(theNurb, 7, knot1, 4, &originalCarray[0][0], 2, GL_MAP1_VERTEX_4);
glColor3f(0.5, 0.5, 0.5);
glLineWidth(2.0);
// theNurb – NURBS объект, 8 – количество элементов в массиве knot,
// knot – массив содержащий значения узлового вектора,
// 4 – количество чисел(координат) для описания контрольной точки (точки
// определяющего многоугольника) здесь точка содержит однородную координату
// параметр ctlarray – указывает на массив контрольных точек
// 3 – степень NURBS кривой плюс единица
// GL_MAP1_VERTEX_4 – тип Безье вычислителя для рациональных контрольных точек
gluNurbsCurve(theNurb, 8, knot, 4, &ctlarray[0][0], 3, GL_MAP1_VERTEX_4);
glColor3f(1, 0, 0);
for (int i = 0; i < 4; i++) {
ctlarray[2][i] = originalCarray[2][i] * 0.25;
}
gluNurbsCurve(theNurb, 8, knot, 4, &ctlarray[0][0], 3, GL_MAP1_VERTEX_4);
glColor3f(0.0, 1.0, 0.0);
for (int i = 0; i < 4; i++) {
ctlarray[2][i] = originalCarray[2][i] * 5;
}
gluNurbsCurve(theNurb, 8, knot, 4, &ctlarray[0][0], 3, GL_MAP1_VERTEX_4);
glColor3f(0.0, 0.0, 1.0);
for (int i = 0; i < 4; i++) {
ctlarray[2][i] = originalCarray[2][i] * 0;
}
gluNurbsCurve(theNurb, 8, knot, 4, &ctlarray[0][0], 3, GL_MAP1_VERTEX_4);
glFlush();
}
void main()
{
glutInitDisplayMode(GLUT_RGBA | GLUT_SINGLE);
glutInitWindowSize(480, 480);
glutInitWindowPosition(100, 100);
glutCreateWindow(" ");
init();
glutDisplayFunc(Display);
glutMainLoop();
}
Editor is loading...