0

我正在尝试在 OpenGL 中制作颜色选择器工具。它可以工作,您可以使用下面的代码。但是有一个明显的问题,如果你测试程序你会发现如果你点击黑色背景,选择的颜色会变成黑色。所以我的问题是如何更改代码以使其识别我单击了哪个多边形或识别出我单击了某物或多边形。

#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream>
#include <cmath>
#include <iterator>

//static void mouseButtonCallback(GLFWwindow* window, int button, int action, int mod);
static void mouse_cursor_callback(GLFWwindow* window, double xpos, double ypos);
float randfloat(){
  float r = ((float)(rand() % 10))/10;
  return r;
}
class RGB{
  public:
    float r;
    float g;
    float b;
    void setColor(float _r, float _g, float _b){
      r = _r;
      g = _g;
      b = _b;
    }
};
RGB selected_col;
RGB mixColor(RGB color1, RGB color2){
  float r = 0;
  float g = 0;
  float b = 0;
  r = sqrt((pow(color1.r,2)+pow(color2.r,2))/2);
  g = sqrt((pow(color1.g,2)+pow(color2.g,2))/2);
  b = sqrt((pow(color1.b,2)+pow(color2.b,2))/2);
  RGB a;
  a.setColor(r,g,b);
  return a;
}


int main() {
  int side_count;
  std::cout<<"Type the no. of sides: "<<std::endl;
  std::cin>>side_count;
  if(side_count < 3){
    return 1;
  }
  srand((unsigned)time(0));
  float rs[side_count];
  float gs[side_count];
  float bs[side_count];
  RGB colors[side_count];
  for (int i=0;i<side_count;i++)
  {
    rs[i] = randfloat();
    gs[i] = randfloat();
    bs[i] = randfloat();
    colors[i].setColor(rs[i],gs[i],bs[i]);
  }

  GLFWwindow* window;
  if (!glfwInit())
    return 1;
  window = glfwCreateWindow(400, 400, "Window", NULL, NULL);

  //glfwSetMouseButtonCallback(window, mouseButtonCallback);
  glfwSetCursorPosCallback(window, mouse_cursor_callback);

  if (!window) {
    glfwTerminate();
    return 1;
  }
  glfwMakeContextCurrent(window);
  if(glewInit()!=GLEW_OK)
    std::cout<<"Error"<<std::endl;
  RGB mcol = colors[1];
  for(int i=0;i<side_count-1;i++)
  {
    mcol = mixColor(mcol, colors[i+1]);
  }
  while(!glfwWindowShouldClose(window)) {
    glClear(GL_COLOR_BUFFER_BIT);
    glBegin(GL_POLYGON);
      glColor3f(mcol.r,mcol.g,mcol.b);glVertex2f(0,0);
      //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%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();
    glBegin(GL_QUADS);
    glColor3f(selected_col.r, selected_col.g, selected_col.b);glVertex2f(-1.0f,0.5f);
    glColor3f(selected_col.r, selected_col.g, selected_col.b);glVertex2f(-.5f,0.5f);
    glColor3f(selected_col.r, selected_col.g, selected_col.b);glVertex2f(-.5f,1.5f);
    glColor3f(selected_col.r, selected_col.g, selected_col.b);glVertex2f(-1.0f,1.5f);
    glEnd();
    glfwSwapBuffers(window);
    glfwPollEvents();
  }
  glfwTerminate();
  return 0;
}

/*static void mouseButtonCallback(GLFWwindow* window, int button, int action, int mods){
  if(button == GLFW_MOUSE_BUTTON_LEFT && action == GLFW_PRESS){
    double xPos, yPos;
    glfwGetCursorPos(window, &xPos, &yPos);
    //std::cout<<"X: "<<xPos<<" Y: "<<yPos<<std::endl;
    double x=xPos;
    int height,width;
    glfwGetWindowSize(window, &width, &height);
    double y = height - yPos;
    unsigned char pixel[4];
    glReadPixels(x, y, 1, 1, GL_RGB,GL_UNSIGNED_BYTE, &pixel);
    selected_col.setColor((float)pixel[0]/255,(float)pixel[1]/255,(float)pixel[2]/255);
    //std::cout<<"R: "<<selected_col.r<<" G: "<<selected_col.g<<" B: "<<selected_col.b<<std::endl;
  }
}*/
void mouse_cursor_callback( GLFWwindow * window, double xpos, double ypos)  
{

  if (glfwGetMouseButton(window, GLFW_MOUSE_BUTTON_LEFT) == GLFW_RELEASE) 
  {
     return;
  }

  double xPos, yPos;
  glfwGetCursorPos(window, &xPos, &yPos);
  //std::cout<<"X: "<<xPos<<" Y: "<<yPos<<std::endl;
  double x=xPos;
  int height,width;
  glfwGetWindowSize(window, &width, &height);
  double y = height - yPos;
  unsigned char pixel[4];
  glReadPixels(x, y, 1, 1, GL_RGB,GL_UNSIGNED_BYTE, &pixel);
  selected_col.setColor((float)pixel[0]/255,(float)pixel[1]/255,(float)pixel[2]/255);
  //std::cout<<"R: "<<selected_col.r<<" G: "<<selected_col.g<<" B: "<<selected_col.b<<std::endl;
}
4

0 回答 0