2011-08-25 75 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);

 }  
    } 
} 

}