0

ボックスの画像を描画するJavaプログラムを作成しています。ほとんどのコードが完成しました。しかし、ボックスを特定の角度だけ回転させる方法を見つけるのに苦労しています。また、ボックスのサイズをパーセンテージで増やし、描画されたすべての画像をキャンバスからクリアするメソッドを作成しようとしています。

これは私がこれまでに持っているコードです://私のBoxクラスimport java.awt.Rectangle;

public class Box 
{
  public Box(Shapes canvasRef, int leftSide, int topLeft, int theWidth, int theHeight)
{
  left = leftSide;
  top= topLeft;
  width = theWidth;
  height = theHeight;
  canvas = canvasRef;
  theBox = new Rectangle(left, top, width, height);
  canvas.addToDisplayList(this);
  show = false;
}
public void draw()
{
  show = true;
  theBox = new Rectangle(left, top, width, height);
  canvas.boxDraw();
}
public void unDraw()
{
  show = false;
  theBox = new Rectangle(left, top, width, height);
  canvas.boxDraw();
}
public Rectangle getBox()
{
  return theBox;
}

public void moveTo(int newX, int newY)
{
  left = newX;
  top = newY;
  draw();
}
// This is the method that I tried but doesn't do anything
  public void turn(int degrees) 
  {
    int newAngle = angle + degrees;
    angle = newAngle % 60;
  }
  clearWorld()
  {
    // Clears the "canvas" upon which boxes are drawn
  }
 public void grow(int percentage)
  {       
   //The box grows the specified percentage, 
     about the center, i.e. increase each side of the box  
     the percentage indicated, with the center unchanged 
  }

// My Driver Program
import javax.swing.JFrame;

public class DisplayList
{
public static void main(String[] args)
{
JFrame frame = new JFrame("Joe The Box");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(250, 250);
Shapes component = new Shapes();
frame.add(component);
frame.setVisible(true);
Box b1 = new Box(component, 150, 100, 30, 50);
Box b2 = new Box(component, 100, 100, 40, 60);
b1.draw();
b2.draw();
b1.turn(90);
b2.grow(100);
b1.clearWorld();
Delay.sleep(2);
b2.moveTo(10,10);
}
}

  public boolean showBox()
  {
    return show;
  }
  private int left;
  private int top;
  private int width;
  private int height;
  private int angle = 0;
  private Shapes canvas;
  private Rectangle theBox;
  private boolean show;
}

Boxクラスの最後の3つのメソッドを教えてもらえますか?何を追加すればいいのか、本当に気になりますか?私はどんな提案にもオープンです。御時間ありがとうございます!

4

2 に答える 2

2

ボックスを (0,0) の周りで回転させる場合は、各座標に回転行列を事前に乗算します。

x=x*Math.cos(t)-y*Math.sin(t)//result of matrix multiplication.
y=x*Math.sin(t)+y*Math.cos(t)//t is the angle

または、極座標に変換しr=Math.hypot(x,y) theta=Math.atan2(x,y)、角度を theta: に追加しますtheta+= rotationAngle。次に直角座標に変換します。x=r*Math.cos(theta) y=r*Math.sin(theta)

ところで、モジュラスは必要ありません。360 度を超える角度も問題ありません。ああ、すべての角度はラジアンである必要があります。度数の場合は、まず 2pi/360 を掛けてラジアンに変換します。

ボックスをスケーリングするには、各座標に一定のスケーリング係数を掛けます。

于 2012-11-14T23:27:42.967 に答える
1

原点を中心に点を回転させるには少なくとも 2 つの方法があり、どちらも数学的に同等です。

  1. 三角法を使用して、ポイントの新しい (x, y) 座標を計算します。

  2. 線形代数、具体的には線形変換行列を使用して、回転を表します。

これらの解決策の詳細については、いくつかのキーワードをグーグルで検索することをお勧めします。理解できない特定の詳細に遭遇した場合は、再度質問してください。姉妹サイトhttp://math.stackexchange.comもチェックしてみてください。ここでは、回転アニメーションの背後にある数学に固有の質問をすることができます。

1 つのポイントに回転を適用する方法を理解したら、ボックスの頂点ごとに計算を繰り返すだけです。単一のポイントの計算を独自のメソッドにカプセル化すると、これが最も簡単になります。

于 2012-11-14T23:32:27.527 に答える