2017-05-02 9 views
3

私はこのアルゴリズムをイメージの回転に使用しますが、四角形ではなく四角形だけを回転させることに気付きました。なぜこのコードは正方形だけを回転させるのですか?

誰でも知っていますか?

メインコード-問題:

public static int[] rotate(double angle, int[] pixels, int width, int height) { 
    final double radians = Math.toRadians(angle); 

    final double cos = Math.cos(radians); 
    final double sin = Math.sin(radians); 

    final int[] pixels2 = new int[pixels.length]; 

    for(int pixel = 0; pixel < pixels2.length; pixel++) { 
     pixels2[pixel] = 0xFFFFFF; 
    } 

    for(int x = 0; x < width; x++) { 
     for(int y = 0; y < height; y++) { 
      final int centerx = width/2; 
      final int centery = height/2; 
      final int m = x - centerx; 
      final int n = y - centery; 
      final int j = ((int) (m * cos + n * sin)) + centerx; 
      final int k = ((int) (n * cos - m * sin)) + centery; 
      if(j >= 0 && j < width && k >= 0 && k < height){ 
       pixels2[ (y * width + x) ] = pixels[ (k * width + j) ]; 
      } 
     } 
    } 
    return pixels2; 
} 

コンテキストアプリケーション:

try { 
    BufferedImage testrot = ImageIO.read(new File("./32x32.png")); 

    int[] linearpixels = new int[testrot.getWidth() * testrot.getHeight()]; 
    int c = 0; 
    for(int i = 0; i < testrot.getWidth(); i++){ 
     for(int j = 0; j < testrot.getHeight(); j++){ 
      linearpixels[c] = testrot.getRGB(i, j); 
      c++; 
     } 
    } 

    int[] lintestrot = rotate(50, linearpixels, 32, 32); 
    BufferedImage image = new BufferedImage(70, 70, BufferedImage.TYPE_INT_RGB); 
    c = 0; 
    for(int i = 0; i < 32; i++){ 
     for(int j = 0; j < 32; j++){ 
      image.setRGB(i, j, lintestrot[c]); 
      c++; 
     } 
    } 

    File outputfile = new File("test002.bmp"); 
    ImageIO.write(image, "bmp", outputfile); 

} catch (IOException e1) { 
    e1.printStackTrace(); 
} 

あなたは33幅または高さに変更した場合、結果が(間違ったイメージ)間違っているだろう。

+1

代わりに[このような](http://stackoverflow.com/questions/37758061/rotate-a-buffered-image-in-java/37758533#37758533)を実行できなかった理由はありますか? – MadProgrammer

+0

アルゴリズムを使うともっと自由になりますが、私はすでにあなたの話題を分析しています。 –

+1

forループの制限を33などに変更していますか? –

答えて

2

アルゴリズムは実際に動作します。問題は、コンテキストアプリケーションのループにあります。その後

for(int i = 0; i < testrot.getHeight(); i++){ 
    for(int j = 0; j < testrot.getWidth(); j++){ 
     linearpixels[c] = testrot.getRGB(j, i); //edit here, tested 
     c++; 
    } 
} 

あなたが例えば40に高さを変更した場合::ピクセルは、ラスタ順に格納され、外側のループは例えば、幅に対する高さと内側のループの繰り返し処理を反復する必要があるため

int[] lintestrot = rotate(50, linearpixels, 32, 40); 

ループは次のように変更する必要がある:順序が関数呼び出し(幅次いで高さ)と比較してループ(高さ次に幅)で反転されること

c = 0; 
for(int i = 0; i < 40; i++){ 
    for(int j = 0; j < 32; j++){ 
     image.setRGB(i, j, lintestrot[c]); 
     c++; 
    } 
} 

注意。

+0

私は既にこの動作を観察していましたが(他のループ)、私はそれを試したこともありませんでした。私はあなたの英語を翻訳して問題の原因を理解します、ありがとう、私はテストしています。サムガク。 –

+0

テスト済みで承認済みです!次回はvar nameへの注意: "LINEARPIXELS" hehe。 –

関連する問題