2012-10-07 45 views
1

我試圖繪製陰影三角形,但出現錯誤的顏色。這裏是我所得到的,如果我叫用紅色,綠色和藍色的函數的例子:陰影三角形上的顏色錯誤

enter image description here

它應該是紅色的左上方,綠色右上角和藍色在頂部底部。但正如你所看到的,顏色不是那樣的。我應該得到的東西是這樣的:

enter image description here

下面的代碼:

unsigned RGB(unsigned char R, unsigned char G, unsigned B){ 
    return (R << 16) | (G << 8) | B; 
} 

    float get_dist(int x1, int y1, int x2, int y2){ 
      int xproj = x2-x1; 
      int yproj = y2-y1; 
      float dist = sqrt(pow(xproj, 2) + pow(yproj, 2)); 
      return dist; 
    } 
    unsigned char getR(unsigned c){ 
      return (c >> 16) & 0xFF; 
    } 
    unsigned char getG(unsigned c){ 
      return (c >> 8) & 0xFF; 
    } 
    unsigned char getB(unsigned c){ 
      return c & 0xFF; 
    } 
    void draw_ftriangle(SDL_Surface * s, int x0, int y0, unsigned c0, int x1, int y1, unsigned c1, int x2, int y2, unsigned c2){ 
      int x; 
      signed d0, d1, d2; 
      unsigned R, G, B, color; 
      int ymin = min(y0, min(y1, y2)); 
      int xmin = min(x0, min(x1, x2)); 
      int ymax = max(y0, max(y1, y2)); 
      int xmax = max(x0, max(x1, x2)); 
      draw_line(s, x0, y0, x1, y1, color); 
      draw_line(s, x1, y1, x2, y2, color); 
      draw_line(s, x0, y0, x2, y2, color); 
      for(; ymin < ymax; ymin++) 
        for(x=xmin; x < xmax; x++) 
          if(ptintr(x, ymin, x0, y0, x1, y1, x2, y2)){ 
            d0 = get_dist(x, ymin, x0, y0); 
            d1 = get_dist(x, ymin, x1, y1); 
            d2 = get_dist(x, ymin, x2, y2); 
            R = d0+d1+d2 == 1 ? getR(c0)*d0 + getR(c1)*d1 + getR(c2)*d2 : 
                      (getR(c0)*d0 + getR(c1)*d1 + getR(c2)*d2)/(d0+d1+d2); 
            G = d0+d1+d2 == 1 ? getG(c0)*d0 + getG(c1)*d1 + getG(c2)*d2 : 
                      (getG(c0)*d0 + getG(c1)*d1 + getG(c2)*d2)/(d0+d1+d2); 
            B = d0+d1+d2 == 1 ? getB(c0)*d0 + getB(c1)*d1 + getB(c2)*d2 : 
                      (getB(c0)*d0 + getB(c1)*d1 + getB(c2)*d2)/(d0+d1+d2); 
            color = RGB(R, G, B); 
            put_pixel(s, x, ymin, color); 
          } 
    } 

我調用一個函數drraw_ftriangle這樣的:

draw_ftriangle(表面,100,100,RGB(255 ,0,0), 235,150,RGB(0,255,0), 4,254,RGB(0,0,255));

我不知道,但我想這個問題應該在這裏:

R = (d0+d1+d2) == 1 ? getR(c0)*d0 + getR(c1)*d1 + getR(c2)*d2 : 
         (getR(c0)*d0 + getR(c1)*d1 + getR(c2)*d2)/(d0+d1+d2); 

同樣的,G和B變量...

我想其他人解釋我,在哪裏這個問題,因爲我在尋找它整天...

回答

1

RG參數,您RGB功能的unsigned char,而你是不是他們鑄造unsigned int befo重新轉移。這意味着,你正在轉移一個8位數字。你知道會發生什麼...

因此,要麼將參數轉換爲unsigned int,要麼在轉換前轉換值。 PS:不管你做什麼,如果你將所有三個參數設置爲相同的類型,這將是很好的!

正如評論,原來它是這樣的:

所以我不認爲你的(X,Y)座標是在 get_dist功能恢復正常。您計算連接這兩個向量的hypoteneuse的長度,但是您不會給它任何基準長度 進行標準化。

+0

嗯,在第二個想法中,我似乎正在閱讀關於'char'在班次時被隱式轉換爲'int'的內容。在那種情況下,我的答案是不恰當的。如果有人能證實我錯了,請告訴我,我會刪除這個答案。 – paddy

+0

我已經將RGB參數更改爲unsigned int,但我仍然得到相同的顏色。 – Arnas

+0

至少這是一個很好的練習......所以我不認爲你的'(x,y)'座標是在'get_dist'函數中規範化的。你計算連接這兩個向量的hypoteneuse的長度,但是你不給它任何基準長度來標準化。我在這裏錯過了什麼嗎? – paddy