C图形:如何在屏幕上绘制x-y轴?
我发现这个代码是一样的,但我没有得到正在做什么。可以有人向我解释代码? 这里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);
}
告诫这样的回答:我没有自己的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。根据这些假设,我们可以得出如下结论:
-
xmid
将是512 -
getmaxx()
将返回1024 -
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循环来处理每个轴上的正方向和负方向。
Thanx为解释。这是一个很大的帮助。 – Harshira
你在哪个平台上运行(Windows,Mac,Linux,DOS)?你还使用什么图形软件包(OpenGL,DirectX,native)? – thurizas
我正在使用基于DOS的Turbo C/C++ – Harshira
过去几天我一直在接受培训,所以我没有时间回到这里。我在分析代码时发布了一个答案。 – thurizas