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

C語言 graphics.h moveto/lineto 繪圖函數用法詳解

     編輯:C 語言問答

graphics.h 繪圖核心:當前點 (CP) 與 moveto/lineto

核心概念:當前點 (Current Position, CP)

  • 繪圖函數 lineto(x, y)、linerel(dx, dy)、arc 等從當前點開始繪製。
  • moveto(x, y):將當前點**移動**到絕對坐標 (x, y),**不畫線**。
  • moverel(dx, dy):相對移動當前點。
  • 初始 CP 為 (0, 0) (圖形模式原點,通常屏幕左上角)。

為什麼「不管用 moveto 都從 (0,0) 畫」?

  1. 未調用 moveto:CP 保持初始 (0,0),lineto 自然從原點畫。
  2. moveto 後緊跟 lineto 但坐標錯誤:如 moveto(100,100); lineto(100,100); 畫長度 0 線段。
  3. 繪圖模式未初始化:initgraph 失敗,繪圖函數無效。
  4. 坐標系誤解:屏幕坐標系 Y 軸**向下**增長,(0,0) 在左上角。
  5. 正確繪製線段流程

    #include <graphics.h>
    #include <conio.h>
    
    int main() {
        int gd = DETECT, gm;
        initgraph(&gd, &gm, "");  // 初始化繪圖模式
        if (graphresult() != grOk) return 1;
    
        moveto(100, 100);   // 1. 移動筆到起點 (不畫線)
        lineto(300, 200);   // 2. 從當前點畫線到終點
        // 此時 CP 更新為 (300, 200)
    
        lineto(400, 100);   // 3. 從 (300,200) 續畫到 (400,100)
    
        getch();
        closegraph();
        return 0;
    }

    moveto vs 線條繪製函數對照

    函數作用CP 變化
    moveto(x,y)移動筆 (提筆)設為 (x,y)
    lineto(x,y)從 CP 畫線到 (x,y)更新為 (x,y)
    moverel(dx,dy)相對移動筆CP += (dx,dy)
    linerel(dx,dy)從 CP 相對畫線CP += (dx,dy)
    getx()/gety()獲取當前 CP 坐標不變

    現代替代方案

    graphics.h (BGI) 非標準、已棄用。現代圖形編程推薦:

    • SDL2:SDL_RenderDrawLine(renderer, x1, y1, x2, y2) 直接指定端點,無 CP 概念。
    • SFML:sf::Vertex line[] = { {x1,y1}, {x2,y2} }; window.draw(line, 2, sf::Lines);
    • Raylib:DrawLine(x1, y1, x2, y2, RED);
    • OpenGL:頂點緩衝區 + Shader,完全可編程管線。

    算法邏輯 (如 Bresenham 畫線、中點畫圓) 通用,只需適配繪圖 API。

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