我正试图编写一个程序,用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);
}
为什么初学者总是添加“C”和“C++”标签?为特定大小的类型使用'stdint.h'。对于tivia来说,Slso的最佳参数大小是'(u)int32_t',因为这是一个32位的CPU,而不是通常短的16位类型。另外:你做了什么来获得错误。你有什么具体的问题吗? “为什么我的代码不运行”太宽泛;请注意,这里大多数人都没有这个硬件。如果这将是一个bresenham线条绘制算法,请注意,如果线条不在0-45度范围内(base/dir取决于实现),通常需要重新排序坐标。 – Olaf
请注意,如果您使用uint32_t作为坐标,则可以安全地比较负值。标准警告:如果您将带符号的负号转换为无符号UB! – Olaf
我的具体问题是“为什么当它应该是一条斜线时画出一条水平线?”但它看起来像我可能需要将其分解成45度部分和代码为每个 –