Untitled

mail@pastecode.io avatar
unknown
plain_text
7 months ago
3.1 kB
6
Indexable
Never
#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();
}