@danij_com

Как нарисовать такую звезду openGL?

Нужно нарисовать вот такую звездочку:
5e4168c9ce6f8785111445.png
Насколько я понимаю, нужно сначала посчитать в циклах расположения точек на порождающей окружности (т.к. вершин по 10, то n=10), а потом как-то их соединить.
float x = R * cos(2 * 3.14*i / n);
float y = R * sin(2 * 3.14*i / n);

Но пока максимум что я смог нарисовать - это:
5e4169a1d412e526962360.png
Соединять точки еще даже не брался, ибо в исходном изображении два десятиугольника повернуты относительно центра на сколько-то градусов, а как хотя бы повернуть точки я так и не придумал, к сожалению.
Буду благодарен советам, возможно я вообще не туда рою...

void display(){
	glClear(GL_COLOR_BUFFER_BIT);
	glBegin(GL_POINTS); 

	float R = 100;
	for (int i = 0; i < 10; i++) {
		int x = R * cos(2 * 3.14*i / 10) + 320;
		int y = R * sin(2 * 3.14*i / 10)+ 240;
		glVertex2i(x, y);
	}
	R = 120;
	for (int i = 0; i < 10; i++) {
		int x = R * cos(2 * 3.14*i / 10) + 320;
		int y = R * sin(2 * 3.14*i / 10) + 240;
		glVertex2i(x, y);
	}
	R = 160;
	for (int i = 0; i < 10; i++) {
		int x = R * cos(2 * 3.14*i / 10) + 320;
		int y = R * sin(2 * 3.14*i / 10) + 240;
		glVertex2i(x, y);
	}

	glEnd();
	glFlush(); 
}

P.S. Прошу сильно не бить, только полез в openGL, возможно (вероятнее всего) еще многого не понимаю.
  • Вопрос задан
  • 949 просмотров
Решения вопроса 1
@MarkusD Куратор тега C++
все время мелю чепуху :)
Фигура состоит из 10 вершин, соединенных 10 ребрами.
На первом шаге тебе надо равномерно распределить по единичной окружности 10 вершин. Сделать это нужно в специально отведенном массиве вершин, т.к. индексированные примитивы в этом старом режиме вывести нельзя.
На втором этапе переключаем контекст на вывод замкнутой линии (GL_LINE_LOOP) и выводим все 10 точек из массива вершин, но со смещением на 3 точки и по модулю 10.

Псевдокод:
void display()
{
   glClear( GL_COLOR_BUFFER_BIT );
   glBegin( GL_LINE_LOOP );

   for( size_t index = 0; index < vertices.size(); ++index )
   {
      const Vertex& vertex = vertices[ ( index * 3 ) % vertices.size() ];
      glVertex2i( vertex.x, vertex.y );
   }

   glEnd();
   glFlush(); 
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@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;
}

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

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы