課題 (05:キャンバス)

作業について

今回の課題は以下のパッケージに作成してください。

パッケージの名前
j1.lesson05

作成するクラスの名前は問題ごとに指示があります。下記を参照してください

課題の提出方法については下記を参照してください。

また、別のコンピューター上に移動する際には、下記を参考にプログラムを持ち帰ってください。

新しい内容

今回、キャンバスに関する新しい内容はありません。

問題

1. クリックされた領域を判定するプログラム (正方形)

作成するクラスの名前
HitRectangleS2

下記のプログラムを変更して、クリックされた領域をメッセージダイアログに表示するプログラムを作成してください。

package j1.lesson05;

import gpjava.Canvas;

import javax.swing.JOptionPane;

public class HitRectangleS2 {

    public static void main(String[] args) {
        new HitRectangleS2().start();
    }

    void start() {
        Canvas.show();
        drawArea(100, 100, "領域A");
        drawArea(300, 100, "領域B");
        drawArea(100, 300, "領域C");
        drawArea(300, 300, "領域D");
        Canvas.waitForPoint("どこかをクリックしてください");
        int x = Canvas.getPointedX();
        int y = Canvas.getPointedY();


    }

    void drawArea(int x, int y, String name) {
        Canvas.drawRect(x, y, 100, 100);
        Canvas.drawStringCenter(x + 50, y + 55, name);
    }


}

このプログラムでは、まず4つの正方形の領域を表示します。それぞれの領域の配置については、書きかけのプログラムを参照してください。

図: クリックされた領域を判定するプログラム (正方形)

このうちどれかをクリックすると、メッセージダイアログでその領域の名前を表示します。たとえば、左上の正方形の内部をクリックすると「領域Aが選択されました」と表示します。なお、クリックされた位置がどの領域にも属さない場合、「どこも選択されませんでした」と表示してください。

ヒント

「領域の左上の座標と選択された座標を受け取って、選択された座標が領域内であればtrueを返し、そうでなければfalseを返す」というメソッドを用意すると楽です。キャンバスは2次元座標(x, y)なので、2つの座標を仮引数で表すと4つの値を受け取ることになります。

2. クリックされた領域を判定するプログラム (円)

作成するクラスの名前
HitCircleS2

下記のプログラムを変更して、クリックされた領域をメッセージダイアログに表示するプログラムを作成してください。

package j1.lesson05;

import gpjava.Canvas;

import javax.swing.JOptionPane;

public class HitCircleS2 {

    public static void main(String[] args) {
        new HitCircleS2().start();
    }

    void start() {
        Canvas.show();
        drawArea(150, 150, "領域A");
        drawArea(350, 150, "領域B");
        drawArea(150, 350, "領域C");
        drawArea(350, 350, "領域D");
        Canvas.waitForPoint("どこかをクリックしてください");
        int x = Canvas.getPointedX();
        int y = Canvas.getPointedY();


    }

    void drawArea(int x, int y, String name) {
        Canvas.drawOval(x - 50, y - 50, 100, 100);
        Canvas.drawStringCenter(x, y + 5, name);
    }


}

このプログラムでは、まず4つの円の領域を表示します。それぞれの領域の配置については、書きかけのプログラムを参照してください。

図: クリックされた領域を判定するプログラム (円)

このうちどれかをクリックすると、メッセージダイアログでその領域の名前を表示します。たとえば、左上の円の内部をクリックすると「領域Aが選択されました」と表示します。なお、クリックされた位置がどの領域にも属さない場合、「どこも選択されませんでした」と表示してください。

それぞれの円の半径は50です。「クリックされた位置が円の内部に含まれるかどうか」という問題は「クリックされた位置と円の中心との距離が50以下かどうか」という問題と同じです。

ヒント

このコースでは平方根の計算を教えていません。2点間の距離を求めるには平方根の計算が必要ですが、距離は必ず正の値なので、全体を二乗してやれば平方根の計算が不要になります。つまり「クリックされた位置と円の中心との距離の二乗が、50の二乗以下かどうか」というようになります。

ヒント

2点間の距離はピタゴラスの定理で計算できます。それぞれのX座標とY座標の差を直角三角形の辺の長さに見立てて計算しましょう。つまり、「クリックされた位置のX座標 – 円の中心のX座標」の絶対値が直角三角形の一辺になります。この値は二乗して使うので、絶対値をわざわざ算出しなくても大丈夫です。

3. ソフトウェアキーボードのプログラム

作成するクラスの名前
SoftKeyboardS2

下記のプログラムを変更して、3桁の整数を入力するプログラムを作成して下さい。

package j1.lesson05;

import gpjava.Canvas;

import javax.swing.JOptionPane;

public class SoftKeyboardS2 {

    public static void main(String[] args) {
        new SoftKeyboardS2().start();
    }

    void start() {
        Canvas.show();
        drawArea(100, 300, "1");
        drawArea(200, 300, "2");
        drawArea(300, 300, "3");
        drawArea(100, 200, "4");
        drawArea(200, 200, "5");
        drawArea(300, 200, "6");
        drawArea(100, 100, "7");
        drawArea(200, 100, "8");
        drawArea(300, 100, "9");


    }

    void drawArea(int x, int y, String name) {
        Canvas.drawRect(x, y, 100, 100);
        Canvas.drawStringCenter(x + 50, y + 55, name);
    }


}

このプログラムでは、1から9までの数字をキャンバス上に表示して、それぞれを格子状の領域に分割しています。これを3回クリックして数字を3つ選択し、それらを順に100の桁、10の桁、1の桁に持つような3桁の整数をプログラムで計算してください。

図: ソフトウェアキーボードのプログラム

たとえば、7の領域、5の領域、3の領域の順にクリックすると、「入力された値は753」と表示されるようにしてください。

なお、今回は範囲外の領域がクリックされた際について考えなくてかまいません。(0でも返しておいてください。)

ヒント

「クリックされた領域を判定するプログラム (正方形)」と似たプログラムです。クリックされた領域に応じて、1桁の数値を返すメソッドを作成しないと非常に大変です。