演習(テキストグラフィックス)の回答例

出典: CourseWiki

public class TextGraphics1 {
    public static void main(String[] args) {
        // 40x20 の2次元配列を確保
        boolean[][] screen = new boolean[40][20];
        /*
         * Javaの2次元配列は,実際には配列の配列である.
         * screen[0]〜screen[39]が,intの配列(int[20])を参照している. 
         * このため,screen.length は 40 になり,
         * screen[0〜39].length は 20 になる.
         */
        System.out.println("Screen width: " + screen.length);
        System.out.println("Screen height: " + screen[0].length);
 
        box(screen, 3, 3, 8, 4);
        boxFill(screen, 14, 4, 8, 4);
        circle(screen, 10, 15, 7);
        circleFill(screen, 30, 5, 10);
        display(screen);
    }
 
    // 指定された配列を表示する
    // 左上が原点で,Y軸は下方向に増加する点に注意すること
    private static void display(boolean[][] screen) {
        // 上側のルーラー表示
        System.out.print("  ");
        for (int x = 0; x < screen.length; x++) {
            System.out.print(x % 10);
        }
        System.out.println();
        System.out.print("  ");
        for (int x = 0; x < screen.length; x++) {
            System.out.print("-");
        }
        System.out.println();
        for (int y = 0; y < screen[0].length; y++) {
            // 左側のルーラー表示
            System.out.print(y % 10 + "|");
            // 配列の値に応じて * か . を表示
            for (int x = 0; x < screen.length; x++) {
                if (screen[x][y]) {
                    System.out.print("*");
                } else {
                    System.out.print(".");
                }
            }
            System.out.println();
        }
    }
 
    // 指定された座標が点を打つ (ただし領域の中に入っているときのみ)
    private static void set(boolean[][] screen, int x, int y) {
        if (inArea(screen, x, y)) {
            screen[x][y] = true;
        }
    }
 
    // 指定された座標が領域内かどうか判定する
    private static boolean inArea(boolean[][] screen, int x, int y) {
        if (x < 0 || screen.length <= x) {
            return false;
        }
        if (y < 0 || screen[0].length <= y) {
            return false;
        }
        return true;
    }
 
    // (x, y)から幅 width,高さ height の塗りつぶした長方形を描画する
    private static void boxFill(boolean[][] screen, int x, int y, int width,
            int height) {
        for (int yy = 0; yy < height; yy++) {
            for (int xx = 0; xx < width; xx++) {
                set(screen, x + xx, y + yy);
            }
        }
    }
 
    // (x, y)から幅 width,高さ height の塗りつぶしていない長方形を描画する
    private static void box(boolean[][] screen, int x, int y, int width,
            int height) {
        for (int yy = 0; yy < height; yy++) {
            set(screen, x, y + yy);
            set(screen, x + width - 1, y + yy);
        }
        for (int xx = 0; xx < width; xx++) {
            set(screen, x + xx, y);
            set(screen, x + xx, y + height - 1);
        }
    }
 
    // 中心 (cx, cy),半径 radius の塗りつぶした円を描画する
    private static void circleFill(boolean[][] screen, int cx, int cy,
            int radius) {
        for (int y = -radius; y <= radius; y++) {
            for (int x = -radius; x <= radius; x++) {
                if (x * x + y * y <= radius * radius) {
                    set(screen, cx + x, cy + y);
                }
            }
        }
    }
 
    // 中心 (cx, cy),半径 radius の塗りつぶしていない円を描画する
    private static void circle(boolean[][] screen, int cx, int cy, int radius) {
        for (int theta = 0; theta < 360; theta++) {
            int x = (int) (Math.cos(Math.toRadians(theta)) * radius);
            int y = (int) (Math.sin(Math.toRadians(theta)) * radius);
            set(screen, cx + x, cy + y);
        }
    }
}

ヒントの通りです.circleFillメソッドでは,円を取り囲む正方形の範囲で調べています.

ナビゲーション