我正在创建一个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类的最后三种方法吗? 我真的想知道要添加什么? 我对任何建议持开放态度。 谢谢你的时间!
答案 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)
至少有两种方法围绕原点旋转一个点,两者在数学上是等价的:
使用三角法计算该点的新(x,y)坐标。
使用线性代数,特别是线性变换矩阵来表示旋转。
我建议您使用某些关键字来了解有关这些解决方案的更多信息。如果您遇到不明白的具体细节,请回过头来提出更多问题。您可能还想查看我们的姐妹网站http://math.stackexchange.com,在那里您可以提出特定于旋转动画背后数学的问题。
了解如何将旋转应用于单个点后,您只需重复计算每个盒子的顶点即可。如果将单个点的计算封装到自己的方法中,这将是最简单的。