首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C >> C 語言問答

C 語言圖形編程:graphics.h 庫中 floodfill 填充顏色詳解

     編輯:C 語言問答

函數原型


#include <graphics.h>

void floodfill(int x, int y, int border_color);

參數詳解

  • x, y:種子點座標。**必須位於封閉圖形內部**任意一點。
  • border_color:邊界顏色。填充演算法遇到此顏色停止擴散。通常設為繪製圖形邊框時使用的顏色 (如 WHITE, RED 或 getcolor())。

工作原理:種子填充演算法

從種子點 (x,y) 開始,向四周 (上下左右或八方向) 擴散,將遇到的非邊界顏色像素替換為當前填充顏色 (由 setfillstyle / setcolor 設定),直到碰到 border_color 或畫面邊緣。

完整範例:繪製並填充奧運五環


#include <graphics.h>
#include <conio.h>

#define R 50  // 圓半徑
#define GAP 15 // 圓心間距

int main() {
    int gd = DETECT, gm;
    initgraph(&gd, &gm, ""); // 初始化圖形模式 (Turbo C 需路徑,現代庫如 WinBGIm 可留空)

    // 設定線條寬度與顏色
    setlinestyle(SOLID_LINE, 0, 3); // 粗線條

    // 五環顏色與圓心座標 (標準排版)
    struct { int x, y, color; } rings[5] = {
        {100, 100, BLUE},   {100+2*R+GAP, 100, BLACK},
        {100+4*R+2*GAP, 100, RED},  {100+R+GAP/2, 100+R, YELLOW},
        {100+3*R+3*GAP/2, 100+R, GREEN}
    };

    for (int i = 0; i < 5; i++) {
        setcolor(rings[i].color);      // 邊框顏色
        circle(rings[i].x, rings[i].y, R); // 畫圓 (邊框)
        
        // 關鍵:填充內部
        // 種子點選圓心 (最保險在內部),邊界顏色設為當前邊框顏色
        floodfill(rings[i].x, rings[i].y, rings[i].color); 
    }

    getch(); // 等待按鍵
    closegraph(); // 關閉圖形模式,恢復文本模式
    return 0;
}

關鍵注意事項 (避坑指南)

  1. 種子點必須在內部:若在邊界上或外部,填充會失敗或填滿整個屏幕。
  2. 邊界顏色必須精確匹配:floodfill 判斷邊界靠像素顏色值。若繪圖時用 setcolor(RED),填充時 border_color **必須是 RED** (或 getcolor())。若邊框有抗鋸齒/漸變色,會導致填充洩漏。
  3. 設定填充樣式:setfillstyle(SOLID_FILL, FILL_COLOR) 設定填充顏色/圖案。若未設定,預設用當前繪圖顏色填充。
  4. 背景色干擾:若背景非黑色,且圖形內部有背景色像素,填充會停在背景色處。確保內部純淨或先 cleardevice()。
  5. 圖形必須封閉:任何缺口 (哪怕 1 像素) 都會導致填充「跑出去」。

現代替代方案

graphics.h (Borland BGI) 是 90 年代產物,**現代開發請使用**:

  • EasyX (Windows, C/C++ 兼容 BGI 語法,支援現代 IDE、高解析度、圖片載入、音頻)。
  • SDL2 / SFML / Raylib (跨平台、硬體加速、遊戲級)。
  • OpenGL / Vulkan (專業 3D/2D 渲染管線)。

總結

floodfill(x, y, border):種子點在內部,邊界色精確匹配,預設填充樣式。掌握此三要素,即可在 BGI/EasyX 中實現任意封閉圖形填色。奧運五環只需循環繪圓+填充即可。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved