2016-09-18 275 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