2012-06-24 4 views
0

픽셀이 배열 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; 

} 

을하지만 그것은 단지 나에게 미친 결과를 제공합니다. 누구든지 오류가 어디에 있는지 알고 있습니까?

답변

2

int[] pixels2 = pixels; 

라인은 배열을 복사하도록되어 있지만, 단지에 대한 참조를 복사합니다. pixels.clone()을 사용하십시오. 사실 새 배열이 필요하기 때문에 new int[pixels.lenght]이면 충분합니다. 결국 새 배열을 이전 배열에 복사하려면 System.arraycopy이 필요합니다.

코드에 다른 문제가 있습니다. 행과 열이 섞여 있습니다. 일부 표현식은 이미지가 행 단위로 저장되고, 나머지는 열 단위로 저장되는 것처럼 작성됩니다. 행별로 (내 가정),이 경우 이해가되지 않습니다 : x*width + y. y*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(); 
    } 
} 
+0

'clone()'은 얕은 복사본을 만듭니다. 즉, 배열 내용을 복제하지 않습니다. 'int'를 사용하면 그다지 중요하지 않습니다. 그러나 일반적으로'int [] pixels2 = Arrays.copyOf (pixels, pixels.length)에서'Arrays.copyOf'를 사용하는 것이 더 좋습니다. –

+0

'copyOf' 얕은 사본도 만듭니다. 사실 개체를 깊이 복사하는 표준 메커니즘이 없습니다. –

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]; 
     } 
    } 
} 

이 아니라 나를 위해 회전에 새로운 있지만,이 과정은 정상적인 회전이 있습니다 : 모두 모두, 내가 확인 작업이 코드가 있습니다. 여전히 많은 수정이 필요합니다. 이는 비효율적이며 느립니다. 그러나 작은 프로그램에서는이 코드가 작동합니다. 나는 당신이 그것을 가지고 더 잘 만들 수 있도록 이것을 게시하고 있습니다. :)

관련 문제