Cohen-Sutherland Line Clipping Algorithm (2)
C++ program - Graphics & Multimedia Lab
Sourcecode:
/* * File: cohsuthlineclip.cpp * Author: nn * * Created on 12 January, 2012, 11:30 AM * * Cohen–Sutherland clipping algorithm clips a line from *P0 = (x0, y0) to P1 = (x1, y1) against a rectangle with *diagonal from (xmin, ymin) to (xmax, ymax). */ #include <cstdlib> #include <graphics.h> #define xmax 350 #define ymax 350 #define xmin 100 #define ymin 100 using namespace std; typedef int OutCode; const int INSIDE = 0; // 0000 const int LEFT = 1; // 0001 const int RIGHT = 2; // 0010 const int BOTTOM = 4; // 0100 const int TOP = 8; // 1000 OutCode ComputeOutCode(double x, double y) { OutCode code; code = INSIDE; // initialised as being inside of clip window if (x < xmin) // to the left of clip window code |= LEFT; else if (x > xmax) // to the right of clip window code |= RIGHT; if (y < ymin) // below the clip window code |= BOTTOM; else if (y > ymax) // above the clip window code |= TOP; return code; } void CohenSutherlandLineClipAndDraw(double x0, double y0, double x1, double y1) { OutCode outcode0 = ComputeOutCode(x0, y0); OutCode outcode1 = ComputeOutCode(x1, y1); bool accept = false; while (true) { if (!(outcode0 | outcode1)) {//Bitwise OR is 0. Trivially accept and get out of loop accept = true; break; } else if (outcode0 & outcode1) {//Bitwise AND is not 0. Trivially reject and get out of loop break; } else { double x, y; OutCode outcodeOut = outcode0? outcode0 : outcode1; if (outcodeOut&TOP){ // point is above the clip rectangle x = x0 + (x1-x0)*(ymax-y0)/(y1-y0); y = ymax; } else if(outcodeOut & BOTTOM) { // point is below the clip rectangle x = x0 + (x1 - x0) * (ymin - y0) / (y1 - y0); y = ymin; } else if (outcodeOut & RIGHT) { // point is to the right of clip rectangle y = y0 + (y1 - y0) * (xmax - x0) / (x1 - x0); x = xmax; } else if (outcodeOut & LEFT) { // point is to the left of clip rectangle y = y0 + (y1 - y0) * (xmin - x0) / (x1 - x0); x = xmin; } if (outcodeOut == outcode0) { x0 = x; y0 = y; outcode0 = ComputeOutCode(x0, y0); } else { x1 = x; y1 = y; outcode1 = ComputeOutCode(x1, y1); } } rectangle(xmin, ymin, xmax, ymax); line(x0, y0, x1, y1); getch(); // cleardevice(); } if(accept) { rectangle(xmin, ymin, xmax, ymax); line(x0, y0, x1, y1); printf("\n\tpoints p0=(%d,%d) p1=(%d,%d)",(int)x0,(int)y0,(int)x1,(int)y1); } } int main(int argc, char** argv) { int gd=DETECT,gm; initgraph(&gd,&gm,NULL); outtextxy(300,10,"BEFORE LINE CLIPPING"); rectangle(xmin,ymin,xmax,ymax); line(10,200,350,300); getch(); cleardevice(); outtextxy(300,10,"AFTER LINE CLIPPING"); CohenSutherlandLineClipAndDraw(10,200,350,300); getch(); closegraph(); return 0; }Output:
nn@linuxmint ~ $ g++ cohsuthlineclip.cpp -lgraph nn@linuxmint ~ $ g++ cohsuthlineclip.cpp -lgraph coh.cpp: In function ‘int main(int, char**)’: coh.cpp:105: warning: deprecated conversion from string constant to ‘char*’ coh.cpp:110: warning: deprecated conversion from string constant to ‘char*’ nn@linuxmint ~ $ ./a.out
Easy to understand :).Thank You :)
ReplyDelete