C Program to implement the Cohen-Sutherland line-clipping algorithm. Make provision to specify the input line, window for clipping and view port for displaying the clipped image. (Use built-in line and rectangle functions).
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 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 | #include <stdio.h> #include <stdlib.h> #include <graphics.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]); printf ("Enter the x- and y-coordinates of the left-top and right-"); printf ("bottom corners\nof the clip window:\n"); for (i=0; i<4; i++) scanf ("%d", &clip[i]); 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(); } |
Description :
This is the one stop educational site for all Electronic and Computer students. If you want to learn something new then we are here to help. We work on Microcontroller projects, Basic Electronics, Digital electronics, Computer projects and also in basic c/c++ programs.
#Home #Sitemap #Submit #Terms of Use
Copyright©2011 electrofriends.com All Rights Reserved
Contact:info@electrofriends.com | Powered by Dhyeya
April 20th, 2011 at 6:04 pm
well done
August 19th, 2011 at 2:58 pm
fine
August 29th, 2011 at 9:38 pm
nice program……….add the header file #include
August 29th, 2011 at 9:39 pm
#include
August 29th, 2011 at 9:40 pm
conio.h