Skip to content

Instantly share code, notes, and snippets.

@meldsza
Created December 17, 2020 08:24
Show Gist options
  • Save meldsza/fb55ac9428ad826ff4380f93752569a2 to your computer and use it in GitHub Desktop.
Save meldsza/fb55ac9428ad826ff4380f93752569a2 to your computer and use it in GitHub Desktop.
//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;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment