2012-11-14 59 views
0

我已經完成了很多與過去的acm圖形庫,我剛剛開始研究斯坦福分配的突破問題。我過去曾多次使用圖形的問題之一是座標不能準確地反映形狀實際出現的位置,儘管我已經對它們進行了雙倍和三倍的檢查。最後,對於這些任務,我最終目睹了它並進行了修改,直到它看起來是正確的。所以很明顯,我在這裏錯過了一些簡單的圖形程序,這不應該很難。基本的Java圖形和座標不能正常工作

例如,使用acm.graphics我的代碼看起來像這樣。

public static final int APPLICATION_WIDTH = 400; 
public static final int APPLICATION_HEIGHT = 600; 

public void setupBorder(){ 
    // **Sets Black Background 
    GRect b = new GRect(0,0,400,600); //** Sets Black Background 
    fillObj(b,Color.black); 
    add(b); 

    //**Sets White Square so border is 5 pixels wide on each side 
    b = new GRect(5,5,APPLICATION_WIDTH-10,APPLICATION_HEIGHT-10); 
    fillObj(b,Color.white); 
    add(b); 
    } 

所以在這裏我的想法,是其移動5個像素權和5個像素下來,我需要減去這些,然後一個額外的5個像素,以具有邊框5個像素,每邊(基本2B + X = 1個側,2a + y =垂直邊)。你會認爲這會在中間形成一個黑色邊框,每邊5個像素,白色方塊,但不是。它在窗口的左側,右側和頂部創建邊界,但不在底部。所以這麼簡單,有什麼可能出錯?我有雙倍,三倍,甚至四倍檢查紙張上的計算,它應該是一個白色正方形,中間有一個5像素黑色邊框,但事實並非如此。我試過改變百分比像素,效果更差。手動編輯這個盒子,直到它看起來接近於Yvalue的-35,儘管這只是有點過分。任何人都知道發生了什麼問題?

appwindow http://i46.tinypic.com/10rob61.jpg

Breakout與並提出來運行這些變化類中的其他方法。

public void run() { 
    /* You fill this in, along with any subsidiary methods */ 
    init(); 
} 

public void init(){ 

    setupBorder(); 


} 

public void setupBorder(){ 
    //**Black Background 
    GRect b = new GRect(0,0,400,600); //**Black Background 
    fillObj(b,Color.black); 
    add(b); 

    b = new GRect(5,5,APPLICATION_WIDTH-10,APPLICATION_HEIGHT-10); 
    fillObj(b,Color.white); 
    add(b); 
} 

public void fillObj(GFillable a, Color argC) 
{ 
    a.setFillColor(argC); 
    a.setFilled(true); 
} 
+2

也許'APPLICATION_HEIGHT'包括菜單? –

+0

Jan Dvorak可能會在...(0,0)可能位於菜單的左上角。但是,在這種情況下,(5,5)會比看起來要高。怪異的... – 2012-11-14 10:28:19

+0

可能是這樣,在調試單個getHeight/getWidth中添加,並且它在控制檯中爲每個值返回兩個值。 645 418 575 400.這只是奇怪的。 – Lorek

回答

2

它看起來像你混淆了應用程序窗口的大小(不包括窗口邊框,但包括菜單,並 400 * 600的情況下)與你的繪製區域的大小( 。不包括菜單),這意味着你畫的繪製區域外(這是下面的菜單

你的窗口有:

  • 由操作系統提供的邊界是400x600在裏面。
  • 一個菜單欄。
  • 菜單欄下方的可繪製區域(畫布)。它比菜單欄寬度小於400x600。

你要麼

  • 需要讀畫布大小,並用它來代替窗口大小:getCanvas().getHeight()
  • 需要設置畫布大小,而不是窗口的大小,讓窗口大小本身如所須。由於GraphicsProgramApplet,這似乎不可能。
  • 需要找出菜單高度並按此量增加窗口高度(最後的手段)。
+0

謝謝Jan,這解釋了很多。我正在研究如何設置canvas大小,並且acm中的javadoc沒有顯示任何明確設置它的方法,但我打賭一旦找出菜單的x尺寸,我可以調整APPLICATION(HEIGHT,WIDTH)所以畫布實際上是400x600或完全刪除菜單的方法。 – Lorek

+0

甚至在我通過將APPLICATIONHEIGHT從600更改爲625來調整窗口大小來解決菜單問題之後,我還是會得到完全相同的結果。 – Lorek

+0

這是因爲如果您調整「APPLICATIONHEIGHT」,那麼您正在繪製更大的矩形,所以它仍然不適合。 –

0

可以使用setSize()方法更改窗口的大小。做比,你仍然面臨一個座標問題。當讀取工作區域的大小時,寬度不斷減小16,高度減少58(可能由於菜單和W7邊界,如前所述)。

你只需要在調用setSize()時注意它。

[OFF]我也在研究這項突破性任務,並且遇到同樣的問題。 [/ OFF]

0

我已經明確地設置了應用程序大小@所有我的小程序的加載時間的習慣。這就是我通常設置窗口大小:

@Override 

public void init(){ 
    resize(APPLICATION_WIDTH, APPLICATION_HEIGHT); 
} 

而且,你不需要調用的init()的run();它會在初始化時由您的appletviewer自動調用。

我認爲你應該使用:

b = new GRect(5,5,getWidth()-10,getHeight()-10); //gets window width & height 

或:::

b = new GRect(5,5,b.getWidth()-10,b.getHeight()-10); //gets former 'b' width & height 

代替:

b = new GRect(5,5,APPLICATION_WIDTH-10,APPLICATION_HEIGHT-10);