<< | к задаче | главная | печатать | обсудить(0 сообщений) >>
Задача: Заливка замкнутой области
Исходник: Заливка замкнутой области [C++, code #651, hits: 8691, рейтинг: 3/4,4.85(1871)] +
аноним: xAtom [добавлен: 22.03.2013] управление:
  1. /*
  2. Автор(с): Кудуштеев Алексей Иванович
  3. e-mail: fobosgame@gmail.com
  4. */
  5. #include <windows.h>
  6. #include <stdio.h>
  7. #include <stack>
  8.  
  9.  
  10.  
  11.  
  12. /* Не рекурсивный алгоритм заливки замкнутой области,
  13. забудьте про Stack overflow раз и навсегда. Только для 32-битных растров. */
  14. void Fill32Bits(LPBYTE bits, int x, int y, int width, int height,
  15. COLORREF color, int bpp = 4) {
  16.  
  17. POINT pt, tmp;
  18. std::stack<POINT> spt;
  19. COLORREF src;
  20.  
  21. pt.x = x;
  22. pt.y = y;
  23. spt.push(pt);
  24.  
  25. // получаем исходный пиксель приёмника
  26. src = *(DWORD*)((bits) + (y*width + x)*bpp);
  27.  
  28. // развернём рекурсию при помощи стека
  29. while(! spt.empty()) {
  30. tmp = spt.top();
  31. spt.pop();
  32.  
  33. // присваиваем пиксель приёмнику
  34. *(DWORD*)((bits) + (tmp.y*width + tmp.x)*bpp) = color;
  35.  
  36. // движемся вправо
  37. if((tmp.x + 1) < width) {
  38. if((*(DWORD*)((bits) + (tmp.y*width + tmp.x+1)*bpp)) == src) {
  39. pt.x = tmp.x + 1;
  40. pt.y = tmp.y;
  41. spt.push(pt);
  42. }
  43. }
  44.  
  45. // движемся влево
  46. if((tmp.x - 1) > -1) {
  47. if((*(DWORD*)((bits) + (tmp.y*width + tmp.x-1)*bpp)) == src) {
  48. pt.x = tmp.x - 1;
  49. pt.y = tmp.y;
  50. spt.push(pt);
  51. }
  52. }
  53.  
  54. // движемся вверх
  55. if((tmp.y + 1) < height) {
  56. if((*(DWORD*)((bits) + ((tmp.y+1)*width + tmp.x)*bpp)) == src) {
  57. pt.x = tmp.x;
  58. pt.y = tmp.y + 1;
  59. spt.push(pt);
  60. }
  61. }
  62.  
  63. // движемся вниз
  64. if((tmp.y - 1) > -1) {
  65. if((*(DWORD*)((bits) + ((tmp.y-1)*width + tmp.x)*bpp)) == src) {
  66. pt.x = tmp.x;
  67. pt.y = tmp.y - 1;
  68. spt.push(pt);
  69. }
  70. }
  71. }
  72. }
  73.  
  74.  
  75.  
  76.  
  77. // точка входа в консольное приложение
  78. int main(void)
  79. {
  80. COLORREF color = RGB(0xFF, 0, 0);
  81. const int width = 400;
  82. const int height = 300;
  83. POINT dots[4];
  84. DWORD size;
  85. PBYTE pixels;
  86. BITMAP binfo;
  87. HPEN pen;
  88. int dot;
  89.  
  90. HWND hwnd = GetForegroundWindow();
  91. HDC hdc = GetDC(hwnd);
  92. HDC bdc = CreateCompatibleDC(hdc);
  93. HBITMAP bmp = CreateBitmap(width, height, 1uL, 32uL, NULL);
  94. if(bmp == NULL) // если не удалось создать 32-битный DDB-растр
  95. return 1; // тогда улетаем
  96.  
  97. SelectObject(bdc, bmp);
  98. PatBlt(bdc, 0, 0, width, height, WHITENESS);
  99.  
  100. // создадим перо для линий шарика
  101. pen = CreatePen(PS_SOLID, 3, RGB(0, 0xFF, 0));
  102. SelectObject(bdc, pen);
  103.  
  104. // зададим 4-контрольные точки для кривых Безье
  105. dots[0].x = width/2;
  106. dots[0].y = height-5;
  107. dots[1].x = 5;
  108. dots[1].y = 5;
  109. dots[2].x = width-5;
  110. dots[2].y = 5;
  111. dots[3].x = dots[0].x;
  112. dots[3].y = dots[0].y;
  113. // выводим в дополнительный контекст
  114. PolyBezier(bdc, dots, sizeof(dots)/sizeof(dots[0]));
  115.  
  116.  
  117. ZeroMemory(&binfo, sizeof(BITMAP));
  118. // запрашиваем параметры пикселей
  119. if(GetObject(bmp, sizeof(BITMAP), (LPVOID)&binfo)) {
  120. dot = binfo.bmBitsPixel >> 3;
  121. size = binfo.bmWidth * binfo.bmHeight * dot;
  122.  
  123. // выделяем память в куче для копирования массива-пикселей
  124. pixels = (PBYTE)HeapAlloc(GetProcessHeap(), 0uL, size);
  125. if(pixels != NULL) {
  126. // запрашиваем массив-пикселей
  127. GetBitmapBits(bmp, (LONG)size, pixels);
  128.  
  129. // заливаем фигуру-щарик
  130. Fill32Bits(pixels, width/2, height/2, width, height, color, dot);
  131.  
  132. // копируем обратно в массив-пикселей DDB-растра
  133. SetBitmapBits(bmp, size, pixels);
  134. HeapFree(GetProcessHeap(), 0uL, pixels);
  135. }
  136. }
  137.  
  138. // выводим в экранный контекст на данный момент поверх консоли
  139. BitBlt(hdc, 0, 0, width, height, bdc, 0, 0, SRCCOPY);
  140.  
  141. // удаляем в конце работы объекты GDI
  142. DeleteObject(pen);
  143. DeleteObject(bmp);
  144. DeleteDC(bdc);
  145. ReleaseDC(hwnd, hdc);
  146.  
  147. getchar();
  148. return 0;
  149. }
Не рекурсивный алгоритм заливки замкнутой области, забудьте про Stack overflow раз и навсегда. Только для 32-битных растров.
Автор(с): Кудуштеев Алексей Иванович
e-mail: fobosgame@gmail.com

+добавить реализацию
 
каталог | задачи | паттерны | исходники | стат | форумы | карта сайта | контакты | ссылки 
© 2000-2017 CodeLAB Group
  Все права защищены
Страница сгенерирована за 0.015382 секунд
Количество запросов к БД: 9, gzip: 8.5kb/42.6kb(81%)