// Sutherland-Hodgman algorithm
#include <gl/glut.h>
#include <vector>
using namespace std;
const double PI = 3.14159;
// setWindow ustawia okno w świecie
void setWindow(double left, double right, double bottom, double top)
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluOrtho2D(left, right, bottom, top);
}
// myDisplay jest wywoływana przez system zawsze, gdy zaistnieje potrzeba odrysowania okna
void myDisplay()
{
glClear(GL_COLOR_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
// wielokąt do którego obicnamy
vector<pair<double,double>> view {{-1,-1}, {1,-1}, {1,1}, {-1,1}};
glColor3d(0.5,0,0);
glBegin(GL_LINE_LOOP);
for(auto [x,y] : view)
glVertex2d(x,y);
glEnd();
// wielokąt, który obcinamy
vector<pair<double,double>> poly {{0,0}, {1.8,-1.5}, {0,-0.7}, {-0.3, -1.3}, {-1.8,0}, {1.8,1.5}};
glColor3d(0,1,0);
glBegin(GL_LINE_LOOP);
for(auto [x,y] : poly)
glVertex2d(x,y);
glEnd();
// TODO
// Zaimplementuj obcinanie i wyświetl obcięty wielokąt
glColor3d(0,0,0);
glLineWidth(1.0);
glFlush();
}
void myInit()
{
glClearColor(1.0, 1.0, 1.0, 1.0); // white background
glLineWidth(2.0); // line width
}
int main(int argc, char** argv)
{
// inicjalizacja GLUTa
glutInit(&argc, argv);
// rozmiary okna
const int X_SIZE = 800;
const int Y_SIZE = 800;
// inicjalizacja okna
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize(X_SIZE, Y_SIZE);
glutInitWindowPosition(200,50);
glutCreateWindow("Sutherland-Hodgman algorithm");
// inicjalizacja kolorów, grubości linii etc.
myInit();
// ustawiamy okno w świecie (ustawiamy kamerę)
setWindow(-2.0, 2.0, -2.0, 2.0);
// ustawiamy vieport (fragment okna w którym rysujemy)
// zazwyczaj jest to całe okno
glViewport(0, 0, X_SIZE, Y_SIZE);
// ustawiamy funkcję rysującą
glutDisplayFunc(myDisplay);
// START
glutMainLoop();
}
Zadanie 1 Zaimplementuj algorytm Cohena-Sutherlanda.
Zadanie 2
Zaimplementuj algorytm Sutherlanda-Hodgmana.
Oryginalny artykuł