2017-03-15 16 views
-1

私はJavaでオブジェクトを回転しようとしていますが、何かが間違っていることに気付きました。 私は180度の回転、私は90度の角度の値を取得するので、360度の角度を取得するには、私はそれを2回回転する必要があります。 どうしたの? 0°,90°,180°オブジェクトの回転角度が間違っています

コード:

public void paintComponent(Graphics g) { 
    super.paintComponent(g); 
    Graphics2D g2 = (Graphics2D) g; 


    if (rotate == true) { 
     ship.increaseDegress(); 
    } 

    ship.draw(g); 

} 

Ship.java

public void increaseDegress() { 
    rotationAngle += 10; 
    if(rotationAngle>360) { 
     rotationAngle = 0; 
    } 
} 

public void draw(Graphics g) { 
    this.g = g; 
    Graphics2D g2 = (Graphics2D) g; 

    AffineTransform at = new AffineTransform(); 
    Rectangle rect = this.getBounds(); 
    at.rotate(Math.toRadians(rotationAngle), rect.getX() + rect.getWidth()/2, rect.getY() + rect.getHeight()/2); 
    g2.setColor(Color.BLUE); 
    g2.setTransform(at); 
    g2.draw(at.createTransformedShape(this)); 

} 
+1

[MCVE]または[短く、自己完結型の正しい例](http://www.sscce.org/)を投稿してください。 –

+0

答えはあなたが0点を考える場所によって異なります – MadProgrammer

+0

あなたは回転を2回適用しているようですが、それ以上の情報は必要ありません(繰り返し塗りつぶす度に、グラフィックス全体を角度で回転しています) – MadProgrammer

答えて

4

それでは、あなたのコードで簡単に見てみましょう...

public void draw(Graphics g) { 
    this.g = g; 
    Graphics2D g2 = (Graphics2D) g; 

    AffineTransform at = new AffineTransform(); 
    Rectangle rect = this.getBounds(); 
    at.rotate(Math.toRadians(rotationAngle), rect.getX() + rect.getWidth()/2, rect.getY() + rect.getHeight()/2); 
    g2.setColor(Color.BLUE); 
    g2.setTransform(at); 
    g2.draw(at.createTransformedShape(this)); 

} 

ので、

  • まずあなたはあなたが適用されますあなたは大丈夫、問題はここにあります... Graphicsコンテキストに変圧器を適用
  • 素敵また、変圧器を回転させるが、のは
  • に移りましょう
  • 素敵な、AffineTransformを作成トランスフォーマーを形状に!

したがって、1回のドローパスでは、図形をrotationAngle * 2で回転します。したがって、角度が10°の場合、シェイプは20°でレンダリングされ、シェイプが20°になると40°でレンダリングされます。

もう少し問題があります。 Graphicsコンテキストに適用される変換は複合語です。つまり、使用可能なコードに基づいて、drawを呼び出すたびに、GraphicsコンテキストがrotationAngleでローテーションされています。 rotationAngleは、パス#1の10°

  • であれば、形状はパス#2の20°
  • に回転されるように、形状は、パス#3で30°
  • に回転され、形状はように... 40°
  • に回転することになるなど...

だから、答えは何ですか?

Graphicsのコンテキストを他の方法に渡すときは、誰も信頼しないので、最初にコピーを作成します。

Graphics gCopy = g.create(); 
shape.draw(gCopy); 
gCopy.dispose(); 

これはGraphicsコンテキストの状態が配合転換を取り除くだろう、私はdrawと呼ばれる前にそれがあった状態に戻されることが保証されます。

他の解決策は、コンテキストを変換しないことです。Graphicsあなたが形を変えているなら、何がポイントですか?

public void draw(Graphics g) { 
    this.g = g; 
    Graphics2D g2 = (Graphics2D) g; 

    AffineTransform at = new AffineTransform(); 
    Rectangle rect = this.getBounds(); 
    at.rotate(Math.toRadians(rotationAngle), rect.getX() + rect.getWidth()/2, rect.getY() + rect.getHeight()/2); 
    g2.setColor(Color.BLUE); 
    g2.draw(at.createTransformedShape(this)); 

} 
+0

ありがとうあなたの説明は私の心を取り除いた。 – TomCa

関連する問題