2016-09-18 309 views
0

我发现这个代码是一样的,但我没有得到正在做什么。可以有人向我解释代码? 这里xmid = getmaxx()/ 2和ymid = getmaxy()/ 2。 我想知道为什么我们使用这些for循环?为什么使用itoa()函数?C图形:如何在屏幕上绘制x-y轴?

line(5,ymid,getmaxx()-5,ymid); 
line(xmid+3,5,xmid+3,getmaxy()-5); 

for(i= xmid+gap;i<getmaxx()-5;i=i+gap) 
{ 
outtextxy(i,ymid-3,"|"); 
itoa(i-xmid,str,10); 
outtextxy(i,ymid+3,str); 
} 
for(i= ymid-gap;i>5;i=i-gap) 
{ 
outtextxy(xmid,i,"-"); 
itoa(ymid-i,str,10); 
outtextxy(xmid+5,i,str); 

} 
for(i= xmid-gap;i>5;i=i-gap) 
{ 

outtextxy(i,ymid-3,"|"); 
itoa(-(xmid-i),str,10); 
outtextxy(i-6,ymid+3,str); 

} 
for(i= ymid+gap;i<getmaxy()-5;i=i+gap) 
{ 
outtextxy(xmid,i,"-"); 
itoa(-(i-ymid),str,10); 
outtextxy(xmid+8,i,str); 
} 
+0

你在哪个平台上运行(Windows,Mac,Linux,DOS)?你还使用什么图形软件包(OpenGL,DirectX,native)? – thurizas

+0

我正在使用基于DOS的Turbo C/C++ – Harshira

+0

过去几天我一直在接受培训,所以我没有时间回到这里。我在分析代码时发布了一个答案。 – thurizas

回答

0

告诫这样的回答:我没有自己的Turbo C/C++所以这个答案是基于查找的功能定义和特征,并从那里拼凑在一起的东西。

(1)itoa是一个非标准C函数(微软具体?),它将整数值转换为字符串。它有签名:char* itoa(int, char* int);。它采用第一个参数中的值并将其转换为第二个参数中的字符数组。最后的整数参数是用来转换字符串的基础。例如,如果int b = 33我们将有:

char buf[33]; 
    itoa(b, buf, 10);  // buf would contain '3', '3', '0' 
    itoa(b, buf, 16);  // buf would contain '2', '1', '0' 
    itoa(b, buf, 2);  // buf would contain '0', '0', '1', '0', '0', '0', '0','1' 

(2)outtextxy功能用于在屏幕上绘制一个字符串,并具有函数签名outtextxy(int x, int y, char* string);拳头参数给出的X和Y坐标(以像素)的字符串将开始。

(3)线条函数用于在屏幕上绘制线条,并具有函数签名line(int x1, int y1, int x2, int y2);,其中前两个参数是第一个起点的x和y坐标(以像素为单位),后两个参数坐标(以像素为单位)为最终点。

(4)getmaxx()getmaxy()根据分辨率以像素为单位返回屏幕的宽度和高度。所以,如果你是在1024×768分辨率运行,getmaxx()将返回1024和getmaxy()将返回768

知道什么是单独的功能呢,我们可以分析代码片段:

line(5,ymid,getmaxx()-5,ymid); 

此画线,在屏幕中间,从左侧开始5个像素,从右侧延伸到5个像素。没有看到完整的代码,我必须作一个假设,ymid是中点屏幕,int ymid = getmaxy()/2;

line(xmid+3,5,xmid+3,getmaxy()-5); 

制作一个类似的假设,即int xmid = getmaxx();,那么这个功能吸引了来自5个像素一条垂直线下方至屏幕顶部至屏幕底部以上5个像素。另外,请注意,我们将xmid偏移了3,因此该线偏离右边三个像素。无法看到更多的代码或这段代码的上下文,我不知道为什么原作者选择这样做。

for(i= xmid+gap;i<getmaxx()-5;i=i+gap) 
    { 
     outtextxy(i,ymid-3,"|"); 
     itoa(i-xmid,str,10); 
     outtextxy(i,ymid+3,str); 
    } 

我们不知道是什么的gap值为但争论的缘故,让我们假定它是20,而且还假设我们的屏幕分辨率为1024×768。根据这些假设,我们可以得出如下结论:

  1. xmid将是512
  2. getmaxx()将返回1024
  3. i将开始在532和运行至超过1024 20的步骤。

由此我们知道i将具有序列{532,552,572,...,992,1032}。有了这个,我们可以看下一行代码,看看这个outtext会画一个'|'使用上面的每个i值和x坐标,并使用y值ymid-3。我对这行代码的最好猜测是,它负责在x轴下面几个像素处绘制刻度标记gap

在下一行中,值i-xmid将刚刚返回距中心的距离,并将其转换为字符串。因此,例如,第一次通过循环i将是532,如果我们减去xmid,我们将得到20,并且我们将导致str具有值“20”。因此,这行代码只是生成刻度标记。

for循环体中的最后一行将在正确的位置打印出字符串,注意outtextxy函数调用中x和y的值,因此标签将在x轴上方打印几个像素,轴。

我没有分析其他三个循环,但我怀疑他们正在做同样的事情,在轴上画刻度线。我们使用四个for循环来处理每个轴上的正方向和负方向。

+0

Thanx为解释。这是一个很大的帮助。 – Harshira