Затруднение с наложением и закраской полигонов
Есть задача: написать и отладить программу с использованием функциональных возможностей OpenGL для реализации отсечения фигур по полю вывода. Я использовал реализацию алгоритма Сазерленда-Ходжмена (Последовательное отсечение многоугольника (его координаты заданы в функции display). И у меня возникла ситуация не очень правильного результата в графическом виде (см. рисунок). Доля "синего" (вошедшего в рамки красного поля - поля вывода) цвета должна быть больше, но получается наложение..перекрытие. Именно в данном конкретном случае, при изменении значений многоугольника (уменьшении количества вершин и придании формы прямоугольника, все отрабатывает хорошо) (рис. с прямоугольником).
Подскажите пожалуйста, как мне решить данную проблему? 

#include <glut.h>
struct Point{
float x,y;
} w[4],oVer[4];
int Nout;
void drawPoly(Point p[],int n){
glBegin(GL_POLYGON);
for(int i=0;i<n;i++)
glVertex2f(p[i].x,p[i].y);
glEnd();
}
bool insideVer(Point p){
if((p.x>=w[0].x)&&(p.x<=w[2].x))
if((p.y>=w[0].y)&&(p.y<=w[2].y))
return true;
return false;
}
void addVer(Point p){
oVer[Nout]=p;
Nout=Nout+1;
}
Point getInterSect(Point s,Point p,int edge){
Point in;
float m;
if(w[edge].x==w[(edge+1)%4].x){ //Vertical Line
m=(p.y-s.y)/(p.x-s.x);
in.x=w[edge].x;
in.y=in.x*m+s.y;
}
else{//Horizontal Line
m=(p.y-s.y)/(p.x-s.x);
in.y=w[edge].y;
in.x=(in.y-s.y)/m;
}
return in;
}
void clipAndDraw(Point inVer[],int Nin){
Point s,p,interSec;
for(int i=0;i<4;i++)
{
Nout=0;
s=inVer[Nin-1];
for(int j=0;j<Nin;j++)
{
p=inVer[j];
if(insideVer(p)==true){
if(insideVer(s)==true){
addVer(p);
}
else{
interSec=getInterSect(s,p,i);
addVer(interSec);
addVer(p);
}
}
else{
if(insideVer(s)==true){
interSec=getInterSect(s,p,i);
addVer(interSec);
}
}
s=p;
}
inVer=oVer;
Nin=Nout;
}
drawPoly(oVer,4);
}
void init(){
glClearColor(0.0f,0.0f,0.0f,0.0f);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0.0,100.0,0.0,100.0,0.0,100.0);
glClear(GL_COLOR_BUFFER_BIT); //поле
w[0].x =20,w[0].y=10;
w[1].x =20,w[1].y=80;
w[2].x =80,w[2].y=80;
w[3].x =80,w[3].y=10;
}
void display(void){
Point inVer[5];
init();
// As Window for Clipping //красный - поле
glColor3f(1.0f,0.0f,0.0f);
drawPoly(w,4);
// As Rect - зеленый = объект наш
glColor3f(0.0f,1.0f,0.0f);
inVer[0].x =10,inVer[0].y=50;
inVer[1].x =15,inVer[1].y=25;
inVer[2].x =30,inVer[2].y=35;
inVer[3].x =50,inVer[3].y=28;
inVer[4].x =45,inVer[4].y=45;
glFlush();
drawPoly(inVer,5);
// As Rect - синий, то, что отсекается
glColor3f(0.0f,0.0f,1.0f);
clipAndDraw(inVer,5);
// Print
glFlush();
}
int main(int argc,char *argv[]){
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGB);
glutInitWindowSize(400,400);
glutInitWindowPosition(100,100);
glutCreateWindow("Polygon Clipping!");
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
введите сюда код