Skip to content

Instantly share code, notes, and snippets.

@meldsza
Created December 17, 2020 08:24
Show Gist options
  • Select an option

  • Save meldsza/fb55ac9428ad826ff4380f93752569a2 to your computer and use it in GitHub Desktop.

Select an option

Save meldsza/fb55ac9428ad826ff4380f93752569a2 to your computer and use it in GitHub Desktop.

Revisions

  1. meldsza created this gist Dec 17, 2020.
    123 changes: 123 additions & 0 deletions lbc.c
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,123 @@
    //LIANG BARKSY ALGORITHM
    #include <GL/glut.h>

    #include <stdio.h>

    double xmin = 50, xmax = 100, ymin = 50, ymax = 100;
    double r[4], p[4], q[4];

    void init() {
    glClearColor(0, 0, 0, 1);
    glClear(GL_COLOR_BUFFER_BIT);
    gluOrtho2D(0, 500, 0, 500);
    }
    void drawRectangle(float x0, float y0, float x1, float y1) {
    glColor3f(1.0, 0.0, 0.0);
    glBegin(GL_LINE_LOOP);
    glVertex2f(x0, y0);
    glVertex2f(x1, y0);
    glVertex2f(x1, y1);
    glVertex2f(x0, y1);
    glEnd();
    }
    void drawLine(float x0, float y0, float x1, float y1) {
    glColor3f(0.0, 1.0, 0.0);
    glBegin(GL_LINES);
    glVertex2f(x0, y0);
    glVertex2f(x1, y1);
    glEnd();
    }
    double maximum() {
    int i;
    double max = 0;
    for (i = 0; i < 4; i++) {
    if (p[i] < 0) {
    if (max < r[i]) {
    max = r[i];
    }
    }
    }
    return max;
    }
    double minimum() {
    int i;
    double min = 1;
    for (i = 0; i < 4; i++) {
    if (p[i] > 0) {
    if (min > r[i]) {
    min = r[i];
    }
    }
    }
    return min;
    }
    void liang_barsky(double x0, double y00, double x1, double y11) {
    double x = x0, y = y00;
    double t1 = 0, t2 = 1;
    double dx = x1 - x0;
    double dy = y11 - y00;
    int i;
    int reject = 0;

    p[0] = -dx;
    q[0] = x0 - xmin;

    p[1] = dx;
    q[1] = xmax - x0;

    p[2] = -dy;
    q[2] = y00 - ymin;

    p[3] = dy;
    q[3] = ymax - y00;

    for (i = 0; i < 4; i++) {
    if (p[i] == 0 && q[i] < 0) {
    reject = 1;
    break;
    } else {
    r[i] = q[i] / p[i];
    }
    }
    t1 = maximum();
    t2 = minimum();
    drawRectangle(200 + xmin, 200 + ymin, 200 + xmax, 200 + ymax);
    if (t1 > t2) {

    } else {
    if (reject == 1) {

    } else {

    x1 = x + (dx * t2);
    y11 = y + (dy * t2);

    x0 = x + (dx * t1);
    y00 = y + (dy * t1);
    drawLine(x0 + 200, y00 + 200, x1 + 200, y11 + 200);
    glFlush();

    }
    }

    }
    void display() {
    double x0 = 50, y00 = 110, x1 = 100, y11 = 110;

    drawRectangle( xmin, ymin, xmax, ymax);

    drawLine(x0, y00, x1, y11);

    liang_barsky(x0, y00, x1, y11);

    glFlush();
    }
    int main(int argc, char * argv[]) {
    glutInit( & argc, argv);
    glutInitWindowSize(750, 750);
    glutCreateWindow("liang barsky algorithm");
    init();
    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
    }