c 绘制函数绘制不正确
c draw function not drawing properly
我正在尝试编写一个程序,使用 Tiva C (Tm4C123GXL) 将数字汽车速度表写入 LCD 屏幕 (ST7735)。附带的代码是画线函数,它应该在两个距离之间画一条直线。如果我将 (speed_x1, speed_y1, 80, 60, ST7735_WHITE) 放入函数中,直到 45 度,绘制的线是水平的,而不是应有的角度。在 45 度到 90 度之后,绘图很好,然后在 90 度之后它再次中断。
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 degress/km/hr)
如果能帮我解决这里的问题,我将不胜感激。谢谢:)
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);
}
如果那是 bresenham line drawing algorithm 请注意,它只能在 45 度内工作。 (总是想知道为什么人们甚至不先看看 WP。)
不确定,但由于您的姓氏起源于德国:您也可以在 WP 上找到它的德语版本。
对于其他角度,您必须 swap/reorder 坐标。如果性能是一个问题(但是当你使用 double 时,它显然是 none)。
类型转换问题。当 dy/dx 小于 1 时,M 的结果为 0。将它们强制转换为浮点数以获得浮点数。
我正在尝试编写一个程序,使用 Tiva C (Tm4C123GXL) 将数字汽车速度表写入 LCD 屏幕 (ST7735)。附带的代码是画线函数,它应该在两个距离之间画一条直线。如果我将 (speed_x1, speed_y1, 80, 60, ST7735_WHITE) 放入函数中,直到 45 度,绘制的线是水平的,而不是应有的角度。在 45 度到 90 度之后,绘图很好,然后在 90 度之后它再次中断。
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 degress/km/hr)
如果能帮我解决这里的问题,我将不胜感激。谢谢:)
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);
}
如果那是 bresenham line drawing algorithm 请注意,它只能在 45 度内工作。 (总是想知道为什么人们甚至不先看看 WP。) 不确定,但由于您的姓氏起源于德国:您也可以在 WP 上找到它的德语版本。
对于其他角度,您必须 swap/reorder 坐标。如果性能是一个问题(但是当你使用 double 时,它显然是 none)。
类型转换问题。当 dy/dx 小于 1 时,M 的结果为 0。将它们强制转换为浮点数以获得浮点数。