0

我正在创建一个 java 程序来绘制一个盒子的图像。我已经完成了大部分代码。但是,我很难找出一种将盒子旋转特定度数的方法。我还试图创建一种方法来按百分比增加框的大小并清除画布上所有绘制的图像。

这是我到目前为止的代码: // My Box class 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 类的最后三种方法吗?我真的很想添加什么?我愿意接受任何建议。谢谢你的时间!

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

至少有两种方法可以围绕原点旋转一个点,这两种方法在数学上都是等效的:

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

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

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

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

于 2012-11-14T23:32:27.527 回答