在我点击的地方画一个三角形

OpenGL - Draw a Triangle wherever I click?

本文关键字:方画一 三角形      更新时间:2023-10-16

我有一个屏幕大小为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()函数中,我如何添加一些代码,在鼠标位置打印一个三角形,当我点击?

更新:

这是我当前的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();
}

是否有一种方法,我可以在鼠标位置以某种方式绘制这个函数,当我左键点击?

在你的代码中,你几乎做到了。您必须添加两件事:在鼠标事件处理程序中,必须设置通知窗口管理器(在本例中为GLUT)刷新显示的标志。该函数为glutPostRedisplay

然后在你的显示函数中,你必须推送3个顶点而不是1个,并将原始类型更改为gl_三角形。这样的

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会简单地画什么。

我没有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()
}