OpenGL - 无论我点击哪里都画一个三角形?

时间:2016-11-07 01:13:23

标签: c++ opengl visual-studio-2015

我有一个屏幕尺寸为1000x800的OpenGL项目,我希望能够在单击鼠标左键时绘制三角形。

我已经设置了鼠标功能正常工作:

struct point
{
    int x;
    int y;
};

std::vector <point> dots;
point OneDot;

void processMouse(int button, int state, int x, int y)
{

    if ((button == GLUT_LEFT_BUTTON) && (state == GLUT_DOWN))
    {
        int yy;
        yy = glutGet(GLUT_WINDOW_HEIGHT);
        y = yy - y; /* In Glut, Y coordinate increases from top to bottom */
        OneDot.x = x;
        OneDot.y = y;

        dots.push_back(OneDot);
   }
}

void display(){
    for (int i = 0; i < dots.size();i++){
        glPointSize(10)
        glBegin(GL_POINTS);
        glVertex2i(dots[i].x, dots[i].y);
    }
}

因此,在我的display()函数中,如何在单击时添加一些在鼠标位置打印三角形的代码?

UPDATE:

这是我当前的drawCircle函数:

void drawCircle(float cx, float cy, float r, float num_segments) {

    // Sets variables for X, Y, Radius and Segments
    glColor3f(1.0, 0.0, 0.0); // Red
    glBegin(GL_POLYGON);

    // To set 0 as origin point
    for (int i = 0; i < num_segments; i++) {
        float theta = 2.0f * 3.14 * i / num_segments;

        float x = r * cosf(theta);
        float y = r * sinf(theta);

        glVertex2f(x + cx, y + cy);
    }
    glEnd();
}

当我点击鼠标时,有没有办法在鼠标位置以某种方式绘制此功能?

2 个答案:

答案 0 :(得分:2)

在您的代码中,您几乎就在那里。您必须添加两件事:在鼠标事件处理程序中,您必须设置一个标志,告诉您的窗口管理器(在您的情况下为GLUT)刷新显示。该函数将是glutPostRedisplay

然后在您的显示功能中,您必须按3个顶点而不是1,并将基本类型更改为GL_TRIANGLES。喜欢这个

void processMouse(int button, int state, int x, int y)
{

    if ((button == GLUT_LEFT_BUTTON) && (state == GLUT_DOWN))
    {
        int yy;
        yy = glutGet(GLUT_WINDOW_HEIGHT);
        y = yy - y; /* In Glut, Y coordinate increases from top to bottom */
        OneDot.x = x;
        OneDot.y = y;

        dots.push_back(OneDot);
        glutPostRedisplay(); ///<<<<<<<<<<
   }
}

void display(){
    glBegin(GL_TRIANGLES);
    for (int i = 0; i < dots.size();i++){
        glPointSize(10)

        glVertex2i(dots[i].x-3, dots[i].y-5);
        glVertex2i(dots[i].x+3, dots[i].y-5);
        glVertex2i(dots[i].x, dots[i].y+5);
    }
    glEnd();
}

或者,如果您想通过点击

来定义三角形的角落
void display(){
    glBegin(GL_TRIANGLES);
    for (int i = 0; i < dots.size();i++){
        glPointSize(10);

        glVertex2i(dots[i].x, dots[i].y);
    }
    glEnd();
}

你真的不必检查3 <= dots.size()是否因为OpenGL只会简单地绘制。

答案 1 :(得分:0)

我没有glbegin表示法的经验,但似乎你错过了glend

它应该是这样的:

void display(){
    glPointSize(10)
    glBegin(GL_POINTS);
    for (int i = 0; i < dots.size();i++){            
        glVertex2i(dots[i].x, dots[i].y);
    }
    glEnd()
}