0

ピクセルが Array に格納されている Bitmap を回転させようとしていint pixels[]ます。私は次の方法を得ました:

public void rotate(double angle) {
    double radians = Math.toRadians(angle);
    double cos, sin;
    cos = Math.cos(radians);
    sin = Math.sin(radians);
    int[] pixels2 = pixels;
    for (int x = 0; x < width; x++)
        for (int y = 0; y < height; y++) {
            int centerx = this.width / 2, centery = this.height / 2;
            int m = x - centerx;
            int n = y - centery;
            int j = (int) (m * cos + n * sin);
            int k = (int) (n * cos - m * sin);
            j += centerx;
            k += centery;
            if (!((j < 0) || (j > this.width - 1) || (k < 0) || (k > this.height - 1)))

                try {
                    pixels2[(x * this.width + y)] = pixels[(k * this.width + j)];
                } catch (Exception e) {
                    e.printStackTrace();
                }
        }
    pixels = pixels2;

}

しかし、それは私にクレイジーな結果をもたらします。エラーがどこにあるか知っている人はいますか?

4

2 に答える 2

2

この線

int[] pixels2 = pixels;

は配列をコピーすることになっていますが、参照をコピーしているだけです。を使用しpixels.clone()ます。実際、必要なのは新しい空の配列だけなので、それでnew int[pixels.lenght]十分です。System.arraycopy最後に、新しいコンテンツを古いアレイにコピーする必要があります。

コードには他にも問題があります。行と列が混同されています。一部の式は、画像が行ごとに格納されているかのように記述され、他の式は列ごとに格納されているように記述されます。行ごと(私の仮定)の場合、これは意味がありません:x*width + yy*width + x行を下にスキップしてから列を右にy移動しています。x全体として、私は正常に機能するこのコードを持っています:

import static java.lang.System.arraycopy;

public class Test
{
  private final int width = 5, height = 5;
  private int[] pixels = {0,0,1,0,0,
                          0,0,1,0,0,
                          0,0,1,0,0,
                          0,0,1,0,0,
                          0,0,1,0,0};

  public Test rotate(double angle) {
    final double radians = Math.toRadians(angle),
    cos = Math.cos(radians), sin = Math.sin(radians);
    final int[] pixels2 = new int[pixels.length];
    for (int x = 0; x < width; x++)
      for (int y = 0; y < height; y++) {
        final int
          centerx = this.width / 2, centery = this.height / 2,
          m = x - centerx,
          n = y - centery,
          j = ((int) (m * cos + n * sin)) + centerx,
          k = ((int) (n * cos - m * sin)) + centery;
        if (j >= 0 && j < width && k >= 0 && k < this.height)
          pixels2[(y * width + x)] = pixels[(k * width + j)];
      }
    arraycopy(pixels2, 0, pixels, 0, pixels.length);
    return this;
  }
  public Test print() {
    for (int y = 0; y < height; y++) {
      for (int x = 0; x < width; x++)
        System.out.print(pixels[width*y + x]);
      System.out.println();
    }
    System.out.println();
    return this;
  }
  public static void main(String[] args) {
    new Test().print().rotate(-45).print();
  }
}
于 2012-06-24T11:12:44.493 に答える
0
public void render(float nx, float ny, float nz, float size, float rotate) {

    int wid = (int) ((width - nz) * size);

    int hgt = (int) ((height - nz) * size);

    if (wid < 0 || hgt < 0) {
        wid = 0;
        hgt = 0;
    }

    for (int x = 0; x < wid; x++) {
        for (int y = 0; y < hgt; y++) {
            double simple = Math.PI;
            int xp = (int) (nx +

            Math.cos(rotate) * ((x / simple) - (wid / simple) / 2) + Math
                    .cos(rotate + Math.PI / 2)
                    * ((y / simple) - (hgt / simple) / 2));
            int yp = (int) (ny + Math.sin(rotate)
                    * ((x / simple) - (wid / simple) / 2) + Math.sin(rotate
                    + Math.PI / 2)
                    * ((y / simple) - (hgt / simple) / 2));

            if (xp + width < 0 || yp + height < 0 || xp >= Main.width
                    || yp >= Main.height) {
                break;
            }
            if (xp < 0
                    || yp < 0
                    || pixels[(width / wid) * x + ((height / hgt) * y)
                            * width] == 0xFFFF00DC) {
                continue;
            }
            Main.pixels[xp + yp * Main.width] = pixels[(width / wid) * x
                    + ((height / hgt) * y) * width];
        }
    }
}

これは私にとっては初めてのローテーションですが、このプロセスは通常のローテーションのプロセスです。まだ多くの修正が必要です。非効率的で遅いです。しかし、小さなプログラムでは、このコードは機能します。あなたがそれを取り、それをより良くすることができるように、私はこれを投稿しています. :)

于 2014-03-29T01:30:47.577 に答える