Advertisement
LilChicha174

Untitled

May 23rd, 2022
138
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.79 KB | None | 0 0
  1. // Рисование круга(для толщины линии)
  2. void draw_Circle(struct Png *image, int x0, int y0, int line_fat, int width_pixel, int Red, int
  3. Green,
  4.                  int Blue) {
  5.     int x = 0;
  6.     int radius = line_fat / 2;
  7.     int y = radius;
  8.     int start = y0 - radius;
  9.     int end = y0 + radius;
  10.     int delta = 1 - 2 * radius;
  11.     int error;
  12.     while (y >= 0) {
  13.         png_byte *row = image->row_pointers[y0 + y];
  14.         png_byte *ptr = &(row[(x0 + x) * width_pixel]);
  15.         ptr[0] = Red;
  16.         ptr[1] = Green;
  17.         ptr[2] = Blue;
  18.  
  19.         png_byte *row1 = image->row_pointers[y0 - y];
  20.         png_byte *ptr1 = &(row1[(x0 + x) * width_pixel]);
  21.         ptr1[0] = Red;
  22.         ptr1[1] = Green;
  23.         ptr1[2] = Blue;
  24.  
  25.         png_byte *row2 = image->row_pointers[y0 + y];
  26.         png_byte *ptr2 = &(row2[(x0 - x) * width_pixel]);
  27.         ptr2[0] = Red;
  28.         ptr2[1] = Green;
  29.         ptr2[2] = Blue;
  30.  
  31.         png_byte *row3 = image->row_pointers[y0 - y];
  32.         png_byte *ptr3 = &(row3[(x0 - x) * width_pixel]);
  33.         ptr3[0] = Red;
  34.         ptr3[1] = Green;
  35.         ptr3[2] = Blue;
  36.         error = 2 * (delta + y) - 1;
  37.         while (start <= y0) {
  38.             for (int i = abs(x - x0); i < (x + x0); i++) {
  39.                 png_byte *row4 = image->row_pointers[start];
  40.                 png_byte *ptr4 = &(row4[i * width_pixel]);
  41.                 ptr4[0] = Red;
  42.                 ptr4[1] = Green;
  43.                 ptr4[2] = Blue;
  44.  
  45.                 png_byte *row5 = image->row_pointers[end];
  46.                 png_byte *ptr5 = &(row5[i * width_pixel]);
  47.                 ptr5[0] = Red;
  48.                 ptr5[1] = Green;
  49.                 ptr5[2] = Blue;
  50.             }
  51.             if (error > 0) {
  52.                 start++;
  53.                 end--;
  54.             }
  55.             break;
  56.         }
  57.         if (delta < 0 && error <= 0) {
  58.             ++x;
  59.             delta += 2 * x + 1;
  60.             continue;
  61.         }
  62.         error = 2 * (delta - x) - 1;
  63.         if (delta > 0 && error > 0) {
  64.             --y;
  65.             delta += 1 - 2 * y;
  66.             continue;
  67.         }
  68.         ++x;
  69.         delta += 2 * (x - y);
  70.         --y;
  71.     }
  72. }
  73.  
  74. void paint_line(struct Png *image, int width_pixel, int x0, int y0, int x1, int y1, int line_fat,
  75.                 int Red, int Green, int Blue) {
  76.     int A, B, sign;
  77.     A = y1 - y0;
  78.     B = x0 - x1;
  79.     if (abs(A) > abs(B)) sign = 1;
  80.     else sign = -1;
  81.     int signa, signb;
  82.     if (A < 0) signa = -1;
  83.     else signa = 1;
  84.     if (B < 0) signb = -1;
  85.     else signb = 1;
  86.     int f = 0;
  87.     png_byte *row = image->row_pointers[y0];
  88.     png_byte *ptr = &(row[x0 * width_pixel]);
  89.     ptr[0] = Red;
  90.     ptr[1] = Green;
  91.     ptr[2] = Blue;
  92.     draw_Circle(image, x0, y0, line_fat, width_pixel, Red, Green, Blue);
  93.     int x = x0, y = y0;
  94.     if (sign == -1) {
  95.         do {
  96.             f += A * signa;
  97.             if (f > 0) {
  98.                 f -= B * signb;
  99.                 y += signa;
  100.             }
  101.             x -= signb;
  102.             png_byte *row = image->row_pointers[y];
  103.             png_byte *ptr = &(row[x * width_pixel]);
  104.             ptr[0] = Red;
  105.             ptr[1] = Green;
  106.             ptr[2] = Blue;
  107.             draw_Circle(image, x, y, line_fat, width_pixel, Red, Green, Blue);
  108.         } while (x != x1 || y != y1);
  109.     } else {
  110.         do {
  111.             f += B * signb;
  112.             if (f > 0) {
  113.                 f -= A * signa;
  114.                 x -= signb;
  115.             }
  116.             y += signa;
  117.             png_byte *row = image->row_pointers[y];
  118.             png_byte *ptr = &(row[x * width_pixel]);
  119.             ptr[0] = Red;
  120.             ptr[1] = Green;
  121.             ptr[2] = Blue;
  122.             draw_Circle(image, x, y, line_fat, width_pixel, Red, Green, Blue);
  123.         } while (x != x1 || y != y1);
  124.     }
  125. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement