Объединить цветные вершины в центре, а не в одной вершине? - PullRequest
1 голос
/ 09 мая 2019

Я пытаюсь создать инструмент «Образец цвета», в котором вы даете ему n цветов, и он создает н-гон, в котором эти цвета сливаются в центре.

Пока что он просто создает n-гон (без указания цветов, он генерирует их случайным образом).

Однако цвета сливаются не в центре, а в одной вершине.

Есть ли какое-то исправление к этому?

#include <GLFW/glfw3.h>
#include <iostream>
#include <cmath>
float randfloat(){
  float r = ((float)(rand() % 10))/10;
  return r;
}
int main() {
  int side_count;
  std::cout<<"Type the no. of sides: "<<std::endl;
  std::cin>>side_count;
  srand(time(NULL));
  std::cout<<randfloat()<<std::endl;
  std::cout<<randfloat()<<std::endl;
  float rs[side_count];
  float gs[side_count];
  float bs[side_count];
  for (int i=0;i<side_count;i++)
  {
    rs[i] = randfloat();
    gs[i] = randfloat();
    bs[i] = randfloat();
  }
  GLFWwindow* window;
  if (!glfwInit())
    return 1;
  window = glfwCreateWindow(800, 800, "Window", NULL, NULL);
  if (!window) {
    glfwTerminate();
    return 1;
  }
  glfwMakeContextCurrent(window);
  if(glewInit()!=GLEW_OK)
    std::cout<<"Error"<<std::endl;

  while(!glfwWindowShouldClose(window)) {
    glClear(GL_COLOR_BUFFER_BIT);
    glClearColor(0.11f,0.15f,0.17f,1.0f);
    glBegin(GL_POLYGON);
      //glColor3f(1.0f,0.0f,0.0f);glVertex3f(-0.5f,0.0f,0.0f);
      for(int i=0; i<side_count;i++)
      {
        float r = rs[i];
        float g = gs[i];
        float b = bs[i];
        float x = 0.5f * sin(2.0*M_PI*i/side_count);
        float y = 0.5f * cos(2.0*M_PI*i/side_count);
        glColor3f(r,g,b);glVertex2f(x,y);
      }
    glEnd();
    glfwSwapBuffers(window);
    glfwPollEvents();
  }
  glfwTerminate();
  return 0;
}

1 Ответ

2 голосов
/ 09 мая 2019

Все, что вам нужно сделать, это добавить новую точку к примитиву GL_POLYGON в центре круглой формы:

glBegin(GL_TRIANGLE_FAN);

glColor3f(0.5f, 0.5f, 0.5f);
glVertex2f(0, 0);

for(int i=0; i <= side_count; i++)
{
    float r = rs[i % side_count];
    float g = gs[i % side_count];
    float b = bs[i % side_count];
    float x = 0.5f * sin(2.0*M_PI*i/side_count);
    float y = 0.5f * cos(2.0*M_PI*i/side_count);
    glColor3f(r, g, b);
    glVertex2f(x, y);
}

glEnd();

Обратите внимание, вы должны определить цвет для центральной точки. Во фрагменте кода я выбрал (0,5, 0,5, 0,5).
Вместо GL_POLYGON можно использовать GL_TRIANGLE_FAN.

...