1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | #include<stdio.h> #include<conio.h> #include<graphics.h> #include<math.h> #define MAX 20 enum { TOP = 0x1, BOTTOM = 0x2, RIGHT = 0x4, LEFT = 0x8 }; enum { FALSE, TRUE }; typedef unsigned int outcode; outcode compute_outcode(int x, int y, int xmin, int ymin, int xmax, int ymax) { outcode oc = 0; if (y > ymax) oc |= TOP; else if (y < ymin) oc |= BOTTOM; if (x > xmax) oc |= RIGHT; else if (x < xmin) oc |= LEFT; return oc; } void cohen_sutherland (double x1, double y1, double x2, double y2,double xmin, double ymin, double xmax, double ymax) { int accept; int done; outcode outcode1, outcode2; accept = FALSE; done = FALSE; outcode1 = compute_outcode (x1, y1, xmin, ymin, xmax, ymax); outcode2 = compute_outcode (x2, y2, xmin, ymin, xmax, ymax); do { if (outcode1 == 0 && outcode2 == 0) { accept = TRUE; done = TRUE; } else if (outcode1 & outcode2) { done = TRUE; } else { double x, y; int outcode_ex = outcode1 ? outcode1 : outcode2; if (outcode_ex & TOP) { x = x1 + (x2 - x1) * (ymax - y1) / (y2 - y1); y = ymax; } else if (outcode_ex & BOTTOM) { x = x1 + (x2 - x1) * (ymin - y1) / (y2 - y1); y = ymin; } else if (outcode_ex & RIGHT) { y = y1 + (y2 - y1) * (xmax - x1) / (x2 - x1); x = xmax; } else { y = y1 + (y2 - y1) * (xmin - x1) / (x2 - x1); x = xmin; } if (outcode_ex == outcode1) { x1 = x; y1 = y; outcode1 = compute_outcode (x1, y1, xmin, ymin, xmax, ymax); } else { x2 = x; y2 = y; outcode2 = compute_outcode (x2, y2, xmin, ymin, xmax, ymax); } } } while (done == FALSE); if (accept == TRUE) line (x1, y1, x2, y2); } void main() { int n; int i, j; int ln[MAX][4]; int clip[4]; int gd = DETECT, gm; printf ("Enter the number of lines to be clipped"); scanf ("%d", &n); printf ("Enter the x- and y-coordinates of the line-endpoints:\n"); for (i=0; i<n; i++) for (j=0; j<4; j++) scanf ("%d", &ln[i][j]); clip[0]=100; clip[1]=100; clip[2]=300; clip[3]=300; initgraph (&gd, &gm, "..//bgi"); rectangle (clip[0], clip[1], clip[2], clip[3]); for (i=0; i<n; i++) line (ln[i][0], ln[i][1], ln[i][2], ln[i][3]); getch(); cleardevice(); rectangle (clip[0], clip[1], clip[2], clip[3]); for (i=0; i<n; i++) { cohen_sutherland (ln[i][0], ln[i][1], ln[i][2], ln[i][3], clip[0], clip[1], clip[2], clip[3]); getch(); } closegraph(); } |