簡體   English   中英

函數在c中畫一條直線

[英]function to draw a straight line in c

我試圖創建一個函數來通過從用戶那里讀取兩個點來繪制一條直線,(x1,y1) 是線的起點,(x2,y2) 是它的終點。 這是我的功能:

    void line(struct pixels* screen)
    {
       float X, Y;
       int i, j, x1, y1, x2, y2, mX, mY;
       scanf("%d%d%d%d", &x1, &y1, &x2, &y2);

       if ((x1 >= 0 && x1 <= screen->width) && (y1 >= 0 && y1 <= screen->height) && (x2 >= 0 && x2 <= screen->width) && (y2 >= 0 && y2 <= screen->height))
      {
         X = (x2 - x1);
         Y = (y2 - y1);
        if (X < 0)
            mX = X*(-1);
        else
            mX = X;

        if (Y < 0)
            mY = Y*(-1);
        else
            mY = Y;

        if( mX>mY )
        {
           if (X > 0)
           {
              for (i = 0; i < X; i++)
              {
                j = (int)(((i*Y) / X) + 0.5);
                screen->pixel[x1 + i][y1 + j] = '*';
              }

            }
            else
           {
             for (i = 0; i > X; i--)
             {
                j = (int)(((i*Y) / X) + 0.5);
                screen->pixel[x1 + i][y1 + j] = '*';
             }
            }

         }
        else
       {
          if (Y > 0)
          {
             for (j = 0; j < Y; j++)
             {
                i = (int)(((j*X) / Y) + 0.5);
                screen->pixel[x1 + i][y1 + j] = '*';
              }
           }
          else
          {
              for (j = 0; j > Y; j--)
              {
                 i = (int)(((j*X) / Y) + 0.5);
                 screen->pixel[x1 + i][y1 + j] = '*';
               }
           }
       }
   }
   else
       printf("ERROR: coordinates exceed the screen limits\n");
  }

問題是:當用戶輸入例如從 (1,1) 到 (10,10) 的代碼時,代碼運行良好,但是當它從 (10,10) 到 (1,1) 時,它不起作用!

谷歌 Bresenham 的畫線算法。 OpenGL 的工作原理:500 行代碼中的軟件渲染器中,有一個關於如何處理此類事情的精彩教程/解釋。 文章中提出了您的具體問題。 強烈推薦。

這是他的 C++ 實現:

void line(int x0, int y0, int x1, int y1, TGAImage &image, TGAColor color) { 
    bool steep = false; 
    if (std::abs(x0-x1)<std::abs(y0-y1)) { 
        std::swap(x0, y0); 
        std::swap(x1, y1); 
        steep = true; 
    } 
    if (x0>x1) { 
        std::swap(x0, x1); 
        std::swap(y0, y1); 
    } 
    int dx = x1-x0; 
    int dy = y1-y0; 
    float derror = std::abs(dy/float(dx)); 
    float error = 0; 
    int y = y0; 
    for (int x=x0; x<=x1; x++) { 
        if (steep) { 
            image.set(y, x, color); 
        } else { 
            image.set(x, y, color); 
        } 
        error += derror; 
        if (error>.5) { 
            y += (y1>y0?1:-1); 
            error -= 1.; 
        } 
    } 
} 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM