Ответы пользователя по тегу OpenGL
  • Как нарисовать такую звезду openGL?

    @danij_com Автор вопроса
    Выложу полный код, может кому-то когда-то понадобится (заранее сочувствую)
    spoiler

    #include "OpenGL\glut.h"
    #include "OpenGL\gl.h"
    #include "math.h"
    
    #define PI 3.1415926535897931159979635
    
    //Определение координаты x точки по формуле x = xc+R*cos(f+(2*pi*i/n)),
    //где xc - координата х центра, а f - угловая координата первой вершины
    float __x(float start_angle, int radius, int i, int n, int offset) {
    	return radius * cos(start_angle + (2 * PI * i / n)) + offset;
    }
    //Определение координаты y точки по формуле y = xc+R*sin(f+(2*pi*i/n)),
    //где xc - координата х центра, а f - угловая координата первой вершины
    float __y(float start_angle, int radius, int i, int n, int offset) {
    	return radius * sin(start_angle + (2 * PI * i / n)) + offset;
    }
    
    //Отрисовка звезды, в ф-цию можно передать радиус, кол-во вершин, смещение по оси х и у,
    //а так же угловую координату начальной точки
    void drawStar(int radius, int vertexes, int offset_x, int offset_y, float start_angle) {
    	glClear(GL_COLOR_BUFFER_BIT);
    	glBegin(GL_LINE_LOOP);
    
    	float* o_x = new float[vertexes];
    	float* o_y = new float[vertexes];
    
    	for (int i = 0; i < vertexes; i++) {
    		o_x[i] = __x(start_angle, radius, i, vertexes, offset_x);
    		o_y[i] = __y(start_angle, radius, i, vertexes, offset_y);
    	}
    	for (int i = 0; i < vertexes; i++) {
    		int ind = (i * 3) % vertexes;   //Точки выводим со смещением на 3
    		glVertex2f(o_x[ind], o_y[ind]); //и по модулю 10ти
    	}
    
    	glEnd();
    	glFlush();
    }
    
    void display(){
    	//Такой вызов отрисовывает звезду аналогичную звезде из условия,
    	//угловая координата выбрана "методом тыка"
    	drawStar(200, 10, 320, 240, 6.6);
    	//так же, кол-во вершин лучше ставить кратное 10ти, иначе фигура,
    	//скорее всего, не отрисуется
    }
    
    int main(int argc, char** argv)
    {
    	glutInit(&argc, argv);
    	glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
    	glutInitWindowSize(640, 480);
    	glutInitWindowPosition(100, 150);
    
    	glutCreateWindow("Star");
    
    	glClearColor(1., 1., 1., 0.);
    	glColor3ub(0, 0, 0); 		
    	glLineWidth(4.);
    	glPointSize(4.); 
    	glMatrixMode(GL_PROJECTION); 
    	glLoadIdentity(); 	
    	gluOrtho2D(0., 640., 0., 480.);
    
    	glutDisplayFunc(display); 
    	glutMainLoop();
    	return 0;
    }

    Ответ написан
    Комментировать