====== Vyplňování oblastí ====== [[http://www.flickr.com/photos/pitel/2394689179|{{ http://farm4.static.flickr.com/3169/2394689179_752e1db1a6_o.png |InvertFill}}]] ===== student.cpp ===== /////////////////////////////////////////////////////////////////////////////// // Soubor studentskych funkci /////////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // include #include "main.h" #include #include #include #include #include /////////////////////////////////////////////////////////////////////////////// // name spaces using namespace std; ///////////////////////////// UDELAT VE CVICENI /////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // seminkove vyplnovani // x, y - souradnice pocatecniho bodu/seminka // color - vyplnovaci barva void FloodFill(int x, int y, const S_RGBA & color) { // Zde zanechte vas kod } ///////////////////////////////// DOMACI UKOL ///////////////////////////////// /////////////////////////////////////////////////////////////////////////////// // radkove vyplnovani // points - vektor vrcholu oblast, posledni hranice je z posledniho do prvniho bodu. // color - barva hranic void InvertEdge(int x1, int y1, int x2, int y2) { if (x1 == x2) { return; } bool steep = abs(y1 - y2) > abs(x1 - x2); if (steep) { SWAP(x1, y1); SWAP(x2, y2) } if (x1 > x2) { SWAP(x1, x2); SWAP(y1, y2); } int step_y = 1; if (y1 > y2) { step_y = -1; } int dx = abs(x2 - x1); int dy = abs(y2 - y1); int P = 2 * dy - dx; int P1 = 2 * dy; int P2 = P1 - 2 * dx; int y = y1; int oldy; int oldx; if (steep) { oldy = y; oldx = x1; } else { oldy = -1; oldx = -1; } for (int x = x1; x < x2; x++) { int myx = x; int myy = y; if (myx < 0) { myx = 0; } if (myx > frame_w) { myx = frame_w; } if (myy < 0) { myy = 0; } if (myy > frame_h) { myy = frame_h; } int linestart; if (steep) { if (oldy != myy) { linestart = myx; while (linestart < frame_h) { fill_buffer[linestart+frame_h*myy] = !fill_buffer[linestart+frame_h*myy]; linestart++; } } } else { if (oldx != myx) { linestart = myy; while (linestart < frame_h) { fill_buffer[linestart+frame_h*myx] = !fill_buffer[linestart+frame_h*myx]; linestart++; } } } oldy = myy; oldx = myx; if (P >= 0) { P += P2; y += step_y; } else { P += P1; } } } void InvertFill(const SeedStack & points, const S_RGBA & color) { if (points.size() == 0) { return; } /* Stencil init */ for (int w = 0; w < frame_w; w++) { for (int h = 0; h < frame_h; h++) { fill_buffer[frame_w * w + h] = false; } } /* Fill stencil */ for (unsigned int i = 0; i < points.size() - 1; i++) { InvertEdge(points[i].x, points[i].y, points[i + 1].x, points[i + 1].y); } InvertEdge(points.front().x, points.front().y, points.back().x, points.back().y); /* Draw stencil */ for (int w = 0; w < frame_w; w++) { for (int h = 0; h < frame_h; h++) { if (fill_buffer[frame_w * w + h] == true) { PutPixel(w, h, tile_buffer[(h % tile_h) * tile_w + (w % tile_w)]); } } } /* Draw edges */ for (unsigned int i = 0; i < points.size() - 1; i++) { Bresenham(points[i].x, points[i].y, points[i + 1].x, points[i + 1].y, color); } Bresenham(points.front().x, points.front().y, points.back().x, points.back().y, color); }