OpenGL
0
Вклад в тег
#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;
}