// 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ł