Advertisement
Xom9ik

Lab_13/15var (IV semester) CG

May 26th, 2018
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.48 KB | None | 0 0
  1. #include "stdafx.h"
  2. #include <stdio.h>
  3. #include <math.h>
  4. #include "glut.h"
  5. int width = 390, height = 320;
  6.  
  7. void PutPixel(int x, int y, int* Color) {
  8.     glBegin(GL_POINTS);
  9.     glColor3ub(Color[0], Color[1], Color[2]);
  10.     glVertex2i(x, y);
  11.     glEnd();
  12. }
  13.  
  14. void DrawLine(int x1, int y1, int x2, int y2, int* Color) {
  15.     int dx, dy, i, e;
  16.     int incx, incy, inc1, inc2;
  17.     int x, y;
  18.     dx = x2 - x1;
  19.     dy = y2 - y1;
  20.     if (dx < 0) dx = -dx;
  21.     if (dy < 0) dy = -dy;
  22.     incx = 1;
  23.     if (x2 < x1) incx = -1;
  24.     incy = 1;
  25.     if (y2 < y1) incy = -1;
  26.     x = x1; y = y1;
  27.     if (dx > dy) {
  28.         PutPixel(x, y, Color);
  29.         e = 2 * dy - dx;
  30.         inc1 = 2 * (dy - dx);
  31.         inc2 = 2 * dy;
  32.         for (i = 0; i<dx; i++) {
  33.             if (e >= 0) {
  34.                 y += incy;
  35.                 e += inc1;
  36.             }
  37.             else
  38.                 e += inc2;
  39.             x += incx;
  40.             PutPixel(x, y, Color);
  41.         }
  42.     }
  43.     else {
  44.         PutPixel(x, y, Color);
  45.         e = 2 * dx - dy;
  46.         inc1 = 2 * (dx - dy);
  47.         inc2 = 2 * dx;
  48.         for (i = 0; i<dy; i++) {
  49.             if (e >= 0) {
  50.                 x += incx;
  51.                 e += inc1;
  52.             }
  53.             else
  54.                 e += inc2;
  55.             y += incy;
  56.             PutPixel(x, y, Color);
  57.         }
  58.     }
  59.  
  60. }
  61. void Fill(int x, int y);
  62. int Color[3] = { 239,202,193 };
  63. int BorderColor[3] = { 209,172,163 };
  64. void Display(void)
  65. {
  66.     glClear(GL_COLOR_BUFFER_BIT);
  67.  
  68.     DrawLine(100, 100, 100, 120, BorderColor);
  69.     DrawLine(100, 120, 80, 120, BorderColor);
  70.     DrawLine(80, 120, 80, 200, BorderColor);
  71.     DrawLine(80, 200, 100, 200, BorderColor);
  72.     DrawLine(100, 200, 100, 220, BorderColor);
  73.     DrawLine(100, 220, 280, 220, BorderColor);
  74.     DrawLine(280, 220, 280, 200, BorderColor);
  75.     DrawLine(280, 200, 300, 200, BorderColor);
  76.     DrawLine(300, 200, 300, 120, BorderColor);
  77.     DrawLine(300, 120, 280, 120, BorderColor);
  78.     DrawLine(280, 120, 280, 100, BorderColor);
  79.     DrawLine(280, 100, 100, 100, BorderColor);
  80.     Fill(101, 100);
  81.  
  82.     glFlush();
  83. }
  84. bool compaireColors(int mas1[], int mas2[])
  85. {
  86.     for (int i = 0; i < 3; i++)
  87.         if (mas1[i] != mas2[i])
  88.             return false;
  89.     return true;
  90. }
  91.  
  92. int* getpixel(int x, int y)
  93. {
  94.     unsigned char pixel[4];
  95.     glReadPixels(x, y, 1, 1, GL_RGB, GL_UNSIGNED_BYTE, pixel);
  96.     int* colors = new int[3];
  97.     colors[0] = pixel[0];
  98.     colors[1] = pixel[1];
  99.     colors[2] = pixel[2];
  100.     return colors;
  101. }
  102.  
  103. int LineFill(int x, int y, int dir, int PrevXl, int PrevXr)
  104. {
  105.     int xl = x;
  106.     int xr = x;
  107.     int* c;
  108.     do {
  109.         c = getpixel(--xl, y);
  110.     }
  111.     while ((!compaireColors(c, BorderColor)) && (!compaireColors(c, Color)));
  112.     do {
  113.         c = getpixel(++xr, y); 
  114.     }
  115.     while ((!compaireColors(c, BorderColor)) && (!compaireColors(c, Color)));
  116.     xl++; xr--;
  117.     DrawLine(xl, y, xr, y, Color);
  118.     for (x = xl; x <= xr; x++)
  119.     {
  120.         c = getpixel(x, y + dir);
  121.         if ((!compaireColors(c, BorderColor)) && (!compaireColors(c, Color)))   x = LineFill(x, y + dir, dir, xl, xr);
  122.     }
  123.  
  124.     for (x = xl; x<PrevXl; x++)
  125.     {
  126.         c = getpixel(x, y - dir);
  127.         if ((!compaireColors(c, BorderColor)) && (!compaireColors(c, Color)))   x = LineFill(x, y - dir, -dir, xl, xr);
  128.     }
  129.  
  130.     for (x = PrevXr; x<xr; x++)
  131.     {
  132.         c = getpixel(x, y - dir);
  133.         if ((!compaireColors(c, BorderColor)) && (!compaireColors(c, Color)))  x = LineFill(x, y - dir, -dir, xl, xr);
  134.     }
  135.  
  136.     return xr;
  137. }
  138.  
  139. void Fill(int x, int y)
  140. {
  141.     LineFill(x, y, 1, x, x);
  142. }
  143.  
  144. void Init()
  145. {
  146.     glClearColor(1.0f, 0.941f, 0.913f, 1.0f);
  147.     gluOrtho2D(0, width, 0, height);
  148. }
  149.  
  150. void main(int argc, char **argv)
  151. {
  152.     glutInit(&argc, argv);
  153.     glutInitDisplayMode(GLUT_SINGLE | GLUT_RGB);
  154.     glutInitWindowPosition(0, 0);
  155.     glutInitWindowSize(width, height);
  156.     glutCreateWindow("Fill");
  157.     Init();
  158.     glutDisplayFunc(Display);
  159.     glutMainLoop();
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement