C图形:如何在屏幕上绘制x-y轴?

时间:2016-09-18 14:48:58

标签: c graphics 2d

我发现这个代码是相同的。但我没有得到正在做的事。可以有人解释我的代码吗? 这里xmid = getmaxx()/ 2和ymid = getmaxy()/ 2。 我想知道为什么我们使用这些for循环?为什么使用itoa()函数?

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);
}

1 个答案:

答案 0 :(得分:0)

请注意这个答案:我不拥有Turbo C / C ++所以这个答案是基于查找函数定义和签名以及从那里拼凑东西。

(1)itoa是一个非标准的C函数(特定于microsoft?),它将整数值转换为字符串。它有签名: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 x 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 x 768.根据这些假设,我们可以得出以下结论:

  1. xmid将是512
  2. getmaxx()将返回1024
  3. i将从532开始直到超过1024,步长为20。
  4. 由此我们知道i将具有序列{532,552,572,....,992,1032}。有了这个,我们可以查看下一行代码,看看外包是否会画出一个&#39; |&#39;使用上述i值和x坐标中的每一个并使用y值ymid-3。我对这行代码的最佳猜测是它负责在{x}轴下方几个像素的gap间隔绘制刻度线。

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

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

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