2015-05-25 59 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上用德语找到它。

对于其他角度,你将不得不交换/重新排序坐标。如果性能是一个问题(但是因为你使用了双倍,它显然没有),所以对于垂直线和对角线,单独绘制算法可能会更好。