无法绘制模拟时钟的指针
Having trouble of drawing hands of an analog clock
我有一个任务要用 C PIC18 入门工具包制作模拟时钟。
我需要画出时钟的所有指针,即秒、分和小时。
我已经用 x 和 y 值在二维数组中初始化了时钟直径的所有 60 个点,并具有时钟中心的值。
为了画手,系统为我提供了 DrawLine 函数,如下所示:
void drawLine( BYTE x0, BYTE y0, BYTE x1, BYTE y1, LineWidth lw )
x0,y0 是线的起点,x1,y1 是线的终点。
drawLine 函数的工作方式类似于 XOR,因此如果我以相同的值再次调用它,线条就会从屏幕上消失。
x=0,y=0时的屏幕值从屏幕左上角开始。
我构建了一个函数来绘制时钟的时针。
我有一个 i 值,它为时钟的每个坐标递增 1,它是这样的:
center[0][0]+(cord[i][0]-center[0][0])/2
但出于某种原因,它只适用于时钟的第四象限(也就是当 i 在 15 到 30 之间时),否则它绘制的线条不像时钟的指针。
下面是完整的代码供您理解,但我想知道我的函数有什么问题,以及我需要做什么才能正常绘制其余象限。
BYTE cord[60][2] = {
{67,0},{71,1},{74,2},{79,3},{81,4},
{82,5},{84,6},{88,9},{91,12},{92,14},
{93,16},{95,18},{96,21},{97,25},{98,29},
{98,32},{98,35},{97,39},{96,43},{95,45},
{93,47},{92,50},{89,53},{85,56},{84,58},
{82,58},{79,60},{76,61},{73,62},{70,63},
{67,63},{64,63},{60,62},{57,61},{54,60},
{51,58},{47,56},{45,54},{43,52},{41,50},
{40,47},{38,44},{37,41},{36,38},{35,35},
{35,32},{35,29},{36,26},{37,22},{38,18},
{40,16},{41,13},{44,10},{47,7},{49,6},
{51,5},{52,4},{54,3},{57,2},{61,1}};
void main(void)
{
BYTE xtemp, ytemp ;
BYTE i = 0;
BYTE center[1][2] = {{67,32}};
InitializeSystem();
while(1)
{
xtemp = center[0][0]+(cord[i][0]-center[0][0])/2;
ytemp = center[0][1]+(cord[i][1]-center[0][1])/2;
drawLine( center[0][0], center[0][1], xtemp, ytemp, thick ) ;
DelayMs(50);
drawLine( center[0][0], center[0][1], xtemp, ytemp, thick );
i++;
if(i>60)
i = 0;
}
}
C 中没有包含标准数据类型 BYTE
。我猜你有一个无符号类型的 typedef。
当您进行带符号的计算时:
xtemp = center[0][0]+(cord[i][0]-center[0][0])/2;
你需要像 int
这样的签名类型。
我有一个任务要用 C PIC18 入门工具包制作模拟时钟。 我需要画出时钟的所有指针,即秒、分和小时。
我已经用 x 和 y 值在二维数组中初始化了时钟直径的所有 60 个点,并具有时钟中心的值。
为了画手,系统为我提供了 DrawLine 函数,如下所示:
void drawLine( BYTE x0, BYTE y0, BYTE x1, BYTE y1, LineWidth lw )
x0,y0 是线的起点,x1,y1 是线的终点。
drawLine 函数的工作方式类似于 XOR,因此如果我以相同的值再次调用它,线条就会从屏幕上消失。
x=0,y=0时的屏幕值从屏幕左上角开始。
我构建了一个函数来绘制时钟的时针。 我有一个 i 值,它为时钟的每个坐标递增 1,它是这样的:
center[0][0]+(cord[i][0]-center[0][0])/2
但出于某种原因,它只适用于时钟的第四象限(也就是当 i 在 15 到 30 之间时),否则它绘制的线条不像时钟的指针。
下面是完整的代码供您理解,但我想知道我的函数有什么问题,以及我需要做什么才能正常绘制其余象限。
BYTE cord[60][2] = {
{67,0},{71,1},{74,2},{79,3},{81,4},
{82,5},{84,6},{88,9},{91,12},{92,14},
{93,16},{95,18},{96,21},{97,25},{98,29},
{98,32},{98,35},{97,39},{96,43},{95,45},
{93,47},{92,50},{89,53},{85,56},{84,58},
{82,58},{79,60},{76,61},{73,62},{70,63},
{67,63},{64,63},{60,62},{57,61},{54,60},
{51,58},{47,56},{45,54},{43,52},{41,50},
{40,47},{38,44},{37,41},{36,38},{35,35},
{35,32},{35,29},{36,26},{37,22},{38,18},
{40,16},{41,13},{44,10},{47,7},{49,6},
{51,5},{52,4},{54,3},{57,2},{61,1}};
void main(void)
{
BYTE xtemp, ytemp ;
BYTE i = 0;
BYTE center[1][2] = {{67,32}};
InitializeSystem();
while(1)
{
xtemp = center[0][0]+(cord[i][0]-center[0][0])/2;
ytemp = center[0][1]+(cord[i][1]-center[0][1])/2;
drawLine( center[0][0], center[0][1], xtemp, ytemp, thick ) ;
DelayMs(50);
drawLine( center[0][0], center[0][1], xtemp, ytemp, thick );
i++;
if(i>60)
i = 0;
}
}
C 中没有包含标准数据类型 BYTE
。我猜你有一个无符号类型的 typedef。
当您进行带符号的计算时:
xtemp = center[0][0]+(cord[i][0]-center[0][0])/2;
你需要像 int
这样的签名类型。