Алгоритм Брезенхема в OpenGL - PullRequest
0 голосов
/ 24 марта 2020

Я впервые изучаю компьютерную графику, и мне дали код ниже от моего профессора. Я думаю, что я понял, как алгоритм реализован в целом, но я не понимаю, как работают строки incx,incy,inc1,inc2. Я, очевидно, знаю, что они существуют, чтобы что-то увеличить, но, поскольку я не до конца понял алгоритм, я немного озадачен. Это полный код:

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

int xstart, ystart, xend, yend;

void myInit() {
    glClear(GL_COLOR_BUFFER_BIT);
    glClearColor(0.0, 0.0, 0.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    gluOrtho2D(0, 500, 0, 500);
}

void draw_pixel(int x, int y) {
    glBegin(GL_POINTS);
    glVertex2i(x, y);
    glEnd();
}

void draw_line(int xstart, int xend, int ystart, int yend) {
    int dx, dy, i, e;
    int incx, incy, inc1, inc2;
    int x,y;

    dx = xend-xstart;
    dy = yend-ystart;

    if (dx < 0) dx = -dx;
    if (dy < 0) dy = -dy;
    incx = 1;
    if (xend < xstart) incx = -1;
    incy = 1;
    if (yend < ystart) incy = -1;
    x = xstart;
    y = ystart;
    if (dx > dy) {
        draw_pixel(x, y);
        e = 2 * dy-dx;
        inc1 = 2*(dy-dx);
        inc2 = 2*dy;
        for (i=0; i<dx; i++) {
            if (e >= 0) {
                y += incy;
                e += inc1;
            }
            else
                e += inc2;
            x += incx;
            draw_pixel(x, y);
        }

    } else {
        draw_pixel(x, y);
        e = 2*dx-dy;
        inc1 = 2*(dx-dy);
        inc2 = 2*dx;
        for (i=0; i<dy; i++) {
            if (e >= 0) {
                x += incx;
                e += inc1;
            }
            else
                e += inc2;
            y += incy;
            draw_pixel(x, y);
        }
    }
}

void myDisplay() {
    draw_line(xstart, xend, ystart, yend);
    glFlush();
}

void main(int argc, char **argv) {

    printf( "Enter (xstart, ystart, xend, yend)\n");
    scanf("%d %d %d %d", &xstart, &ystart, &xend, &yend);

    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
    glutInitWindowSize(500, 500);
    glutInitWindowPosition(0, 0);
    glutCreateWindow("Bresenham's Line Algorithm Visualization");
    myInit();
    glutDisplayFunc(myDisplay);
    glutMainLoop();
}
...