2011-08-25 73 views
1

我想學習這本書的Java圖形程序The Art and Science of Java練習寫畫一個金字塔

演習書The Art and Science of Java第129頁

enter image description here

我的問題是金字塔應該以窗口爲中心

import acm.program.*; 
import acm.graphics.*; 

public class pyramid extends GraphicsProgram { 

    public void run() { 


     for (int i = 0; i < BRICK_IN_BASE; i++) { 
      for (int j = 0; j < i; j++) { 

       int x = BRICK_WIDTH * j ; 
       int y = BRICK_HEIGHT * i; 

       GRect brick = new GRect(x, y, BRICK_WIDTH, BRICK_HEIGHT); 
       add(brick); 

      } 
     } 

    } 



    private static final int BRICK_WIDTH =30 ; 
    private static final int BRICK_HEIGHT =20 ; 
    private static final int BRICK_IN_BASE = 12; 
} 

回答

2

我的問題是金字塔應該在窗口

如果你的意思是你有一個固定的區域拉攏和金字塔應該在這一領域爲中心居中:

  1. GET金字塔的最大寬度:BRICK_IN_BASE * BRICK_WIDTH
  2. 開始在x = (area.width-pyramid_width)/2
  3. 相同的高度:BRICK_IN_BASE * BRICK_HEIGHT
  4. 開始在y = (area.height-pyramid_height)/2

除此之外,注意對於基礎之上每個級別,你必須添加BRICK_WIDTH/2到x偏移量。

編輯(澄清):

以上幾點適用於獲得x和y座標,開始在畫。請注意,

  1. 與「從x開始」我的意思是最初的x偏移量。你的磚x座標將是x_offset + BRICK_WIDTH * j
  2. 爲開始爲y
  3. 你必須通過BRICK_WIDTH/2增加x_offset每個級別相同,即int x = x_offset + (BRICK_IN_BASE - i - 1) * BRICK_WIDTH/2 + BRICK_WIDTH * j;(你開始在頂部,這樣的水平就必須計算作爲(BRICK_IN_BASE - i - 1)以獲得頂部行11和底部行0)。
+0

高度應該是'BRICK_IN_BASE * BRICK_HEIGHT'雖然 – Voo

+0

@Voo是,該死的複製粘貼;) – Thomas

+0

@thomas感謝的人,,試過,但不會像變得像一個金字塔三角形 – tito11

1

所以,你需要找到x和y的偏移量。 金字塔的寬度是BRICK_WIDTH * BRICK_IN_BASE,所以你把窗口和subract(BRICK_WIDTH * BRICK_IN_BASE)/ 2。 可以使用相同的邏輯來查找y偏移寬度的一半。

int x = xOffset + BRICK_WIDTH * j;
int y = yOffset + BRICK_HEIGHT * i;

我對acm軟件包並不熟悉,這取決於它如何實現GRect,這可能仍然是半磚。但你可以輕鬆解決。

0

import acm.graphics。 ; 導入acm.program。;

公共類BrickInTheWall延伸GraphicsProgram {

private static final int BRICK_WIDTH = 20; 
private static final int BRICK_HEIGHT = 10; 
private static final int BRICK_IN_BASE = 10; 


public void run(){ 

INT W = BRICK_WIDTH * BRICK_IN_BASE + 200,H = BRICK_HEIGHT * BRICK_IN_BASE + 200;

對(INT A = 1;一個< = BRICK_IN_BASE;一個++){ 的for(int i = 0;我<一個;我++){ GRect RECT =新GRect((W * 2) - BRICK_WIDTH/2 * a + BRICK_WIDTH * i,40 + BRICK_HEIGHT * a,BRICK_WIDTH,BRICK_HEIGHT); add(rect);

 }  
    } 
} 

}