练习写一个绘制金字塔的图形程序

时间:2011-08-25 13:43:46

标签: java

我正在尝试从本书中学习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;
}

3 个答案:

答案 0 :(得分:2)

  

我的问题是金字塔应该在窗口中居中

如果你的意思是你有一个固定的区域可以画入,金字塔应该在那个区域居中:

  1. 获取金字塔的最大宽度:BRICK_IN_BASE * BRICK_WIDTH
  2. x = (area.width-pyramid_width)/2
  3. 开始
  4. 高度相同:BRICK_IN_BASE * BRICK_HEIGHT
  5. y = (area.height-pyramid_height)/2
  6. 开始

    除此之外,请注意,对于基数以上的每个级别,您必须将BRICK_WIDTH/2添加到x偏移量。

    编辑(澄清):

    以上几点适用于让x和y坐标开始绘制。注意

    1. with“start at x”我的意思是初始x偏移量。你的砖的x坐标是x_offset + BRICK_WIDTH * j
    2. 从y
    3. 开始一样
    4. 对于每个级别,您必须将{_ 1}增加x_offset,即BRICK_WIDTH/2(您从顶部开始,因此该级别必须计算为(BRICK_IN_BASE - i - 1)in为了获得最高行的11和最低行的0)。

答案 1 :(得分:1)

所以你需要找到x和y的偏移量。 金字塔的宽度为BRICK_WIDTH * BRICK_IN_BASE,因此您占据窗口宽度的一半并减去(BRICK_WIDTH * BRICK_IN_BASE)/ 2。 您使用相同的逻辑来查找y偏移量。

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

我不熟悉acm包,取决于它如何实现GRect,这可能仍然是半块砖。但你可以轻松解决这个问题。

答案 2 :(得分:0)

import acm.graphics。; import 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;

for(int a = 1; a&lt; = BRICK_IN_BASE; a ++){ for(int i = 0; i&lt; a; i ++){ GRect rect = new GRect((w * 2) - BRICK_WIDTH / 2 * a + BRICK_WIDTH * i,40 + BRICK_HEIGHT * a,BRICK_WIDTH,BRICK_HEIGHT); 添加(RECT);

        }       
    }
}

}