2015-05-25 78 views
0

我正試圖編寫一個程序,用Tiva C(Tm4C123GXL)將數字汽車speedo寫入LCD屏幕(ST7735)。附加的代碼是繪製線功能,應該在兩個距離之間繪製一條直線。如果我將(speed_x1,speed_y1,80,60,ST7735_WHITE)放入函數中,直到45度,繪製的線是水平的,而不是像應該的那樣傾斜。 45度之後直到90度,繪圖很好,然後在90後再次打破。c繪圖功能沒有正確繪圖

speed_x1 = 80 - 55 * cos((PI/180) * (speed * 1.8)) 
speed_y1 = 60 - 55 * sin((PI/180) * (speed * 1.8)) 

(我想要的速度表到最大,在100,因此速度* 1.8 1.8輩分/公里/小時)

在這裏解決我的問題,任何幫助將不勝感激。謝謝:)

void ST7735_DrawLine(short x1, short y1, short x2, short y2, unsigned short color) { 
     // unsigned char hi = color >> 8, lo = color; 
     //int x=x1; 
     //int y=y1; 

     int dy = y2 - y1; 
     int dx = x2 - x1; 
     double m = dy/dx; 
     double c = y1 - m * x1; 
     if ((x1 >= _width) || (y1 >= _height) || (x2 >= _width) || (y2 >= _height)) return; 
     setAddrWindow(x1, y1, x1 + x2 - 1, y2); 
     while(x1 <= x2) 
     { 
      if (m <= 1) 
      { 
       x1 = x1 + 1; 
       y1 = m * x1 + c; 
       ST7735_DrawPixel(x1,y1,color); 
      } 
      else 
      { 
       y1 = y1 + 1; 
       x1 = (y1 - c)/m; 
       ST7735_DrawPixel(x1,y1,color); 
      } 
     } 
    } 

void ST7735_DrawPixel(short x, short y, unsigned short color) { 
    if ((x < 0) || (x >= _width) || (y < 0) || (y >= _height)) 
     return; 
    setAddrWindow(x,y,x+1,y+1); 
    pushColor(color); 
} 
+1

爲什麼初學者總是添加「C」和「C++」標籤?爲特定大小的類型使用'stdint.h'。對於tivia來說,Slso的最佳參數大小是'(u)int32_t',因爲這是一個32位的CPU,而不是通常短的16位類型。另外:你做了什麼來獲得錯誤。你有什麼具體的問題嗎? 「爲什麼我的代碼不運行」太寬泛;請注意,這裏大多數人都沒有這個硬件。如果這將是一個bresenham線條繪製算法,請注意,如果線條不在0-45度範圍內(base/dir取決於實現),通常需要重新排序座標。 – Olaf

+0

請注意,如果您使用uint32_t作爲座標,則可以安全地比較負值。標準警告:如果您將帶符號的負號轉換爲無符號UB! – Olaf

+0

我的具體問題是「爲什麼當它應該是一條斜線時畫出一條水平線?」但它看起來像我可能需要將其分解成45度部分和代碼爲每個 –

回答

1

類型轉換問題。當dy/dx小於1時,M結果爲0。輸入它們以漂浮以獲得漂浮物。

0

如果這將是一個bresenham line drawing algorithm請注意,它只能在45度。 (總是想知道爲什麼我們甚至沒有先看看WP。) 不確定,但是因爲你的姓氏有德國血統:你也可以在WP上用德語找到它。

對於其他角度,你將不得不交換/重新排序座標。如果性能是一個問題(但是因爲你使用了雙倍,它顯然沒有),所以對於垂直線和對角線,單獨繪製算法可能會更好。