void cohenclipanddraw(double xz,double yz,double xo,double yo) { outcode outcode0,outcode1,outcodeout; double sx,sy,vx0,vy0,vx1,vy1; int accept=0,done=0; outcode0=computecode(xz,yz); outcode1=computecode(xo,yo); do { if(!(outcode0|outcode1)) { accept=1; done=1; } else if(outcode0&outcode1) done=1; else { double x,y; outcodeout=outcode0?outcode0:outcode1; if(outcodeout&TOP) { x=xz+(xo-xz)*(ymax-yz)/(yo-yz); y=ymax; } else if(outcodeout&BOTTOM) { x=xz+(xo-xz)*(ymin-yz)/(yo-yz); y=ymin; } else if(outcodeout&RIGHT) { y=yz+(yo-yz)*(xmax-xz)/(xo-xz); x=xmax; } else { y=yz+(yo-yz)*(xmin-xz)/(xo-xz); x=xmin; } if(outcodeout==outcode0) { xz=x;yz=y; outcode0=computecode(xz,yz); } else { xo=x;yo=y; outcode1=computecode(xo,yo); } } } while(!done); glColor3f(0.0,1.0,0.0); glBegin(GL_LINE_LOOP); glVertex2f(xvmin,yvmin); glVertex2f(xvmax,yvmin); glVertex2f(xvmax,yvmax); glVertex2f(xvmin,yvmax); glEnd(); if(accept) { sx=(xvmax-xvmin)/(xmax-xmin); sy=(yvmax-yvmin)/(ymax-ymin); vx0=xvmin+(xz-xmin)*sx; vy0=yvmin+(yz-ymin)*sy; vx1=xvmin+(xo-xmin)*sx; vy1=yvmin+(yo-ymin)*sy; glColor3f(1.0,0.0,0.0); glBegin(GL_LINES); glVertex2f(vx0,vy0); glVertex2f(vx1,vy1); glEnd(); } }
void cohensutherland(double x0, double y0, double x1, double y1) { int o0,o1,out; bool accept=false, done=false; o0=computecode(x0,y0); o1=computecode(x1,y1); do { if(!(o0|o1)) { accept=true; done=true; } else if(o0&o1) done=true; else { double x,y; out = o0?o0:o1; if(out&RIGHT) { x=xmax; y=y0+(y1-y0)*(xmax-x0)/(x1-x0); } else if(out&LEFT) { x=xmin; y=y0+(y1-y0)*(xmin-x0)/(x1-x0); } else if(out&TOP) { y=ymax; x=x0+(x1-x0)*(ymax-y0)/(y1-y0); } else { y=ymin; x=x0+(x1-x0)*(ymin-y0)/(y1-y0); } if(out==o0) { x0=x; y0=y; o0=computecode(x0,y0); } else { x1=x; y1=y; o1=computecode(x1,y1); } } } while(!done); if(accept) { double sx=(xvmax-xvmin)/(xmax-xmin); double sy=(yvmax-yvmin)/(ymax-ymin); double vx0=xvmin+(x0-xmin)*sx; double vy0=yvmin+(y0-ymin)*sy; double vx1=xvmin+(x1-xmin)*sx; double vy1=yvmin+(y1-ymin)*sy; glColor3f(0.0,0.0,1.0); glBegin(GL_LINE_LOOP); glVertex2f(xvmin,yvmin); glVertex2f(xvmin,yvmax); glVertex2f(xvmax,yvmax); glVertex2f(xvmax,yvmin); glEnd(); glColor3f(0.0,1.0,0.0); glBegin(GL_LINES); glVertex2d(vx0,vy0); glVertex2d(vx1,vy1); glEnd(); } }