b'\n_START_ARTICLE_\nCohen-Sutherlands algoritme\n_START_PARAGRAPH_\nCohen\xe2\x80\x93Sutherlands algoritme er en datagrafikk-algoritme som brukes for linjeklipping. Algoritmen deler et todimensjonalt omr\xc3\xa5de inn i ni regioner (eller et tredimensjonalt omr\xc3\xa5de inn i 27 regioner), og avgj\xc3\xb8r s\xc3\xa5 p\xc3\xa5 en effektiv m\xc3\xa5te hvilke linjer og linjesegmenter som er synlige i den midterste regionen (skjermporten)._NEWLINE_Algoritmen ble utviklet i 1967, under arbeid med en flysimulator, av Danny Cohen og Ivan Sutherland.\n_START_SECTION_\nEksempel p\xc3\xa5 C/C++ implementasjon\n_START_PARAGRAPH_\ntypedef int OutCode;const int INSIDE = 0; // 0000const int LEFT = 1;   // 0001const int RIGHT = 2;  // 0010const int BOTTOM = 4; // 0100const int TOP = 8;    // 1000// Regn ut bitkode for et punkt (x, y) ved bruk av klipperektangelet// avgrenset diagonalt av (xmin, ymin), og (xmax, ymax)// REGN MED AT xmax, xmin, ymax og ymin er globale konstanter.OutCode ComputeOutCode(double x, double y){_NEWLINE_OutCode code;_NEWLINE__NEWLINE_code = INSIDE;          // settes som utgangspunkt inni klippevinduet_NEWLINE__NEWLINE_if (x < xmin)           // til venstre for klippevinduet_NEWLINE_code |= LEFT;_NEWLINE_else if (x > xmax)      // til h\xc3\xb8yre for klippevinduet_NEWLINE_code |= RIGHT;_NEWLINE_if (y < ymin)           // under klippevinduet_NEWLINE_code |= BOTTOM;_NEWLINE_else if (y > ymax)      // over klippevinduet_NEWLINE_code |= TOP;_NEWLINE__NEWLINE_return code;}// Cohen\xe2\x80\x93Sutherland linjeklippingsalgoritme klipper linjer fra// P0 = (x0, y0) til P1 = (x1, y1) mot et rektangel med // diagonal fra (xmin, ymin) til (xmax, ymax).void CohenSutherlandLineClipAndDraw(double x0, double y0, double x1, double y1){_NEWLINE_// regn ut utkoder for P0, P1, og evt. punkter som ligger utenfor klipperektangelet_NEWLINE_OutCode outcode0 = ComputeOutCode(x0, y0);_NEWLINE_OutCode outcode1 = ComputeOutCode(x1, y1);_NEWLINE_bool accept = false;_NEWLINE__NEWLINE_while (true) {_NEWLINE_if (!(outcode0 | outcode1)) { // Bitvis OR er 0. Trivielt akseptert, g\xc3\xa5 ut av l\xc3\xb8kken_NEWLINE_accept = true;_NEWLINE_break;_NEWLINE_} else if (outcode0 & outcode1) { // Bitvis AND er ulik 0. Trivielt forkastet, g\xc3\xa5 ut av l\xc3\xb8kken_NEWLINE_break;_NEWLINE_} else {_NEWLINE_// feilet begge tester, s\xc3\xa5 regn ut nytt linjesegment_NEWLINE_// fra utsiden til krysningspunkt med kanten til klipprektangelet_NEWLINE_double x, y;_NEWLINE__NEWLINE_// Minst ett endepunkt ligger utenfor klipperektangelet; velg det._NEWLINE_OutCode outcodeOut = outcode0 ? outcode0 : outcode1;_NEWLINE__NEWLINE_// Finn s\xc3\xa5 krysningspunktet;_NEWLINE_// bruk formel y = y0 + slope * (x - x0), x = x0 + (1 / slope) * (y - y0)_NEWLINE_if (outcodeOut & TOP) {           // punktet er over klipperektangelet_NEWLINE_x = x0 + (x1 - x0) * (ymax - y0) / (y1 - y0);_NEWLINE_y = ymax;_NEWLINE_} else if (outcodeOut & BOTTOM) { // punktet er under klipperektangelet_NEWLINE_x = x0 + (x1 - x0) * (ymin - y0) / (y1 - y0);_NEWLINE_y = ymin;_NEWLINE_} else if (outcodeOut & RIGHT) {  // punktet er til h\xc3\xb8yre for klipperektangelet_NEWLINE_y = y0 + (y1 - y0) * (xmax - x0) / (x1 - x0);_NEWLINE_x = xmax;_NEWLINE_} else if (outcodeOut & LEFT) {   // punktet er til venstre for klipperektangelet_NEWLINE_y = y0 + (y1 - y0) * (xmin - x0) / (x1 - x0);_NEWLINE_x = xmin;_NEWLINE_}_NEWLINE__NEWLINE_// N\xc3\xa5 flyttes punktet p\xc3\xa5 utsiden inn til krysningspunktet for \xc3\xa5 klippe_NEWLINE_// og klargj\xc3\xb8re for neste utregning._NEWLINE_if (outcodeOut == outcode0) {_NEWLINE_x0 = x;_NEWLINE_y0 = y;_NEWLINE_outcode0 = ComputeOutCode(x0, y0);_NEWLINE_} else {_NEWLINE_x1 = x;_NEWLINE_y1 = y;_NEWLINE_outcode1 = ComputeOutCode(x1, y1);_NEWLINE_}_NEWLINE_}_NEWLINE_}_NEWLINE_if (accept) {_NEWLINE_               // F\xc3\xb8lgende funksjoner er utelatt, og m\xc3\xa5 implementeres basert_NEWLINE_               // p\xc3\xa5 brukerens plattform (OpenGL/graphics.h osv.)_NEWLINE_               DrawRectangle(xmin, ymin, xmax, ymax);_NEWLINE_               LineSegment(x0, y0, x1, y1);_NEWLINE_}}'