Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* gcc -o file file.c -lglut -lGL -lGLU */
- #include <GL/glut.h>
- int abs(int n) { return n > 0 ? n : -n; }
- int rnd(float n) { return (int) (n + 0.5); }
- void display();
- void drawLineBres(int xa, int ya, int xb, int yb, int inverted);
- void drawLineDDA(int xa, int ya, int xb, int yb);
- void drawLine(int xa, int ya, int xb, int yb, int reversed);
- int main(int argc, char **argv)
- {
- glutInit(&argc, argv);
- glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
- glutInitWindowSize(800, 480);
- int windowID = glutCreateWindow("a0307");
- glutDisplayFunc(display);
- glutMainLoop();
- return 0;
- }
- void display()
- {
- glClearColor(0, 0, 0, 0);
- glClear(GL_COLOR_BUFFER_BIT);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluOrtho2D(-50, 50, -50, 50);
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- glBegin(GL_POINTS);
- glColor3d(1, 0, 0);
- glVertex2d(0, 0);
- glVertex2d(0, 30);
- drawLineBres(10, 0, 25, 5, 0);
- drawLineDDA(20, 0, 35, 5);
- drawLine(30, 0, 45, 5, 0);
- glEnd();
- glFlush();
- }
- void drawLineBres(int xa, int ya, int xb, int yb, int inverted)
- {
- int dx = xb - xa,
- dy = yb - ya,
- slope;
- if (xa > xb)
- return drawLineBres(xb, yb, xa, ya, inverted);
- if (abs(dy) > abs(dx))
- return drawLineBres(ya, xa, yb, xb, ! inverted);
- if (dy < 0)
- {
- slope = -1;
- dy = -dy;
- }
- else slope = 1;
- int incE = 2 * dy,
- incNE = 2 * (dy - dx),
- p = 2 * dy - dx;
- for (; xa <= xb; xa++)
- {
- if (inverted)
- glVertex2d(ya, xa);
- else
- glVertex2d(xa, ya);
- if (p < 0)
- p += incE;
- else {
- p += incNE;
- ya += slope;
- }
- }
- }
- void drawLineDDA(int xa, int ya, int xb, int yb)
- {
- int dx = xb - xa,
- dy = yb - ya;
- int steps = abs(dx) > abs(dy) ? abs(dx) : abs(dy);
- float xIncrement = dx / (float) steps,
- yIncrement = dy / (float) steps,
- x = xa,
- y = ya;
- glVertex2d(rnd(x), rnd(y));
- for (int k = 0; k < steps; k++)
- {
- x += xIncrement;
- y += yIncrement;
- glVertex2d(rnd(x), rnd(y));
- }
- }
- void drawLine(int xa, int ya, int xb, int yb, int reversed)
- {
- int dx = xb - xa,
- dy = yb - ya;
- if (dx < 0)
- drawLine(xb, yb)
- if (abs(dx) >= abs(dy))
- {
- double m = (double) (yb - ya) / (xa - xb);
- for (; dx > 0 ? xb > xa : xb < xa; xa += xInc)
- {
- if (reversed)
- glVertex2d((int) y, xa);
- else
- glVertex2d(xa, (int) y);
- y += yInc;
- }
- if (reversed)
- glVertex2d((int) y, xa);
- else
- glVertex2d(xa, (int) y);
- }
- else return drawLine(ya, xa, yb, xb, ! reversed);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement