0

申し訳ありませんが、これはちょっとしたコードですが、ここで切り取るものはあまりありません。これは、イメージ (アルファベットのスプライト シート) を読み取り、それを個々の文字である小さなサブイメージに分割することになっています。キーを押すと対応する文字が画面に表示されますが、この部分は実際のサブイメージを作成するためのものです。

http://i.imgur.com/4I4uX.png (画像)

package typeandscreen;
(where the imports should be, i just cut them out to save space)
public class Font{

    final int width = 78; //gives the dimensions of the image
    final int height = 32;
    final int rows = 4;
    final int cols = 13;

BufferedImage letters[] = new BufferedImage[rows*cols]; //makes the array of
                                                        //subimages. rows*cols is
                                                        //the number of subimages
void test(){
    try{
        final BufferedImage totalImage = ImageIO.read(new File("ABCabcs.png"));
                //loads the big image itself

この次の部分は、私を混乱させるものです。i と j は何のためにあるのですか?なぜそれらを加算したり乗算したりするのですか? この部分は、サブイメージがどれくらいの大きさでなければならないかを調べるためのものですよね? 行 * 列である 4 x 13 であってはなりませんか?

    for(int i = 0; i < rows; i++){

        for(int j = 0; j < cols; j++){
            letters[(i * cols) + j] = totalImage.getSubimage(
                j * width,
                j * height,
                width,
                height
            );
        }
    }
    } catch(IOException e){
        e.printStackTrace();
    }
  }
}

i と j が何をしているのかわかりません。ここで何が欠けていますか?

4

1 に答える 1

3

そのはず

 j * width,
 i * height,

また、幅と高さが 1 文字のサイズに対して大きすぎるように見えますが、そのまま使用されます。

i は文字の行を通過し、j は列を通過します。位置 (j,i) の文字の座標を取得するには、j (列のインデックス) を幅 (各文字の幅) で、i (行のインデックス) を (文字の) 高さで乗算する必要があります。

文字は、文字に対応する画像の配列です。

 letters[(i * cols) + j]

は、長方形の行列を 1 次元配列に入れるための標準的なイディオムです。写真を見てください:

  0 1 2
0 A B C
1 D E F

として配列に格納されます

0 1 2 3 4 5
A B C D E F

したがって、この配列の F のインデックスは 1 * 3 + 2 = 5 になります。i = 1、j = 2、cols = 3 です (3 つの列があるため)

于 2012-01-31T03:59:15.253 に答える