Java用于在Java中旋转,增加大小和清除Box图像的方法

时间:2012-11-14 23:18:30

标签: java

我正在创建一个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类的最后三种方法吗? 我真的想知道要添加什么? 我对任何建议持开放态度。 谢谢你的时间!

2 个答案:

答案 0 :(得分:2)

如果您正在围绕(0,0)旋转方框,请将每个坐标预先乘以rotation matrix

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将它们转换为弧度。

要缩放框,请将每个坐标乘以常量缩放系数。

答案 1 :(得分:1)

至少有两种方法围绕原点旋转一个点,两者在数学上是等价的:

  1. 使用三角法计算该点的新(x,y)坐标。

  2. 使用线性代数,特别是线性变换矩阵来表示旋转。

  3. 我建议您使用某些关键字来了解有关这些解决方案的更多信息。如果您遇到不明白的具体细节,请回过头来提出更多问题。您可能还想查看我们的姐妹网站http://math.stackexchange.com,在那里您可以提出特定于旋转动画背后数学的问题。

    了解如何将旋转应用于单个点后,您只需重复计算每个盒子的顶点即可。如果将单个点的计算封装到自己的方法中,这将是最简单的。