使用dda/bresenham算法使用OpenGL鼠标函数绘制直线

使用dda/bresenham算法使用OpenGL鼠标函数绘制直线,opengl,mouseevent,bresenham,dda,Opengl,Mouseevent,Bresenham,Dda,所以我必须用鼠标功能画一条线。当鼠标单击两个点时,程序需要绘制一条连接它们的线 我需要制作一个想象中的10x10阵列,映射上面的点,然后连接点。窗口大小无关紧要 我不知道该怎么处理这个虚构的数组,也不知道如何保存鼠标坐标,这样我就可以找到它们了。帮助 #include <glut.h> #include<stdio.h> void RenderScene(void) //점 { glClear(GL_COLOR_BUFFER_BIT); // Flush

所以我必须用鼠标功能画一条线。当鼠标单击两个点时,程序需要绘制一条连接它们的线

我需要制作一个想象中的10x10阵列,映射上面的点,然后连接点。窗口大小无关紧要

我不知道该怎么处理这个虚构的数组,也不知道如何保存鼠标坐标,这样我就可以找到它们了。帮助

#include <glut.h>
#include<stdio.h>

void RenderScene(void) //점
{
    glClear(GL_COLOR_BUFFER_BIT);
    // Flush drawing commands
    glFlush();
}


void SetupRC(void) //바탕
{
    // setup clear color
    glClearColor(0.0f, 0.0f, 1.0f, 1.0f);
}


void ChangeSize(GLsizei w, GLsizei h) {
        GLfloat  aspectRatio;
        // Prevent a divide by zero
        if (h == 0)
            h = 1;
        // Set Viewport to window dimensions
        glViewport(0, 0, w, h);
        // Reset coordinate system
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        // Establish clipping volume (left, right, bottom, top, near, far)
        aspectRatio = (GLfloat)w / (GLfloat)h;
        glOrtho(0, w, h, 0, 1.0, -1.0); 
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
}


void myRectf(GLfloat    x1, GLfloat     y1, GLfloat     x2, GLfloat     y2){
    glPointSize(10);

    ////ddaLine

    int dx, dy;
    int m = (y2 - y1) / (x2 - x1);
    for (int i = x1; i <= x2; i++)
    {
        if (m <= 1)
        {
            dx = 1;
            dy = m * dx;
        }
        else
        {
            dy = 1;
            dx = dy / m;
        }
        x1 += dx;
        y1 += dy;

        glBegin(GL_POINTS);
        glVertex3f(x1, y1, 0.f);
        glEnd();
    }

    /////breline
    while (x1 < x2)
    {
        int dx = x2 - x1;
        int dy = y2 - y1;
        int di = 2 * dy - dx;
        int ds = 2 * dy;
        int dt = 2 * (dy - dx);

        x1++;
        if (di < 0)
            di += ds;
        else
        {
            y1++;
            di += dt;
        }
        glBegin(GL_POINTS);
        glVertex3f(x1, y1, 0.f);
        glEnd();
    }
}

GLfloat g_x = -1000.f, g_y = -1000.f;

void MouseHandler(int button, int state, int x, int y){
    if (button == GLUT_LEFT_BUTTON
        && state == GLUT_DOWN){
        g_x = x; g_y = y;
        printf("%d,%d \n", x, y);
    }
    glutPostRedisplay();
}


void main(int argc, char* argv[]){
    int array[10][10];

    glutInit(&argc, argv); // initialize GL context
    // single or double buffering | RGBA color mode
    glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
    glutCreateWindow("Lec01");
    // callback function
    glutDisplayFunc(RenderScene);
    glutReshapeFunc(ChangeSize);

    SetupRC();          // initialize render context(RC)
    glutMouseFunc(MouseHandler);

    glutMainLoop();     // run GLUT framework
}
#包括
#包括
void RenderScene(void)//점
{
glClear(GLU颜色缓冲位);
//刷新图形命令
glFlush();
}
无效设置RC(无效)//바탕
{
//设置清晰的颜色
glClearColor(0.0f、0.0f、1.0f、1.0f);
}
无效更改大小(GLsizei w、GLsizei h){
GLfloat aspectRatio;
//防止被零除
如果(h==0)
h=1;
//将视口设置为窗口尺寸
glViewport(0,0,w,h);
//重置坐标系
glMatrixMode(GL_投影);
glLoadIdentity();
//建立剪裁体积(左、右、下、上、近、远)
aspectRatio=(GLfloat)w/(GLfloat)h;
格洛托(0,w,h,0,1.0,-1.0);
glMatrixMode(GLU模型视图);
glLoadIdentity();
}
void myRectf(GLfloat x1、GLfloat y1、GLfloat x2、GLfloat y2){
gl点大小(10);
////达林
int-dx,dy;
int m=(y2-y1)/(x2-x1);
对于(int i=x1;i