Java 使用线集合旋转三角形
我有点困在试图旋转一个三角形的数字 所以我试着旋转一个由直线组成的三角形。我有两个类,一行类创建一行。还有一个三角形类,它通过合并所有直线来创建所有三角形。首先,下面是我的Line类,它实现了一个名为Curve的接口。曲线包含绘制、旋转、平移等的定义。请注意,我只是为我的问题添加了相关函数。所以在我的旋转函数中,所讨论的直线(X2,Y2)的端点是旋转的。我不确定这个公式是否正确执行Java 使用线集合旋转三角形,java,rotation,Java,Rotation,我有点困在试图旋转一个三角形的数字 所以我试着旋转一个由直线组成的三角形。我有两个类,一行类创建一行。还有一个三角形类,它通过合并所有直线来创建所有三角形。首先,下面是我的Line类,它实现了一个名为Curve的接口。曲线包含绘制、旋转、平移等的定义。请注意,我只是为我的问题添加了相关函数。所以在我的旋转函数中,所讨论的直线(X2,Y2)的端点是旋转的。我不确定这个公式是否正确执行 public class Line implements Curve { double x1Point;
public class Line implements Curve {
double x1Point;
double y1Point;
double x2Point;
double y2Point;
public Line(double x1, double y1, double x2, double y2){
this.x1Point = x1;
this.y1Point = y1;
this.x2Point = x2;
this.y2Point = y2;
}
public void rotate(double degrees) {
x2Point = ((double)(x1Point * Math.cos(degrees * (Math.PI / 180)))) - ((double)(y1Point * Math.sin(degrees * (Math.PI / 180))));
y2Point = ((double)(x1Point * Math.cos(degrees * (Math.PI / 180)))) + ((double)(y1Point * Math.sin(degrees * (Math.PI / 180))));
}
然后在我的Triangle类中,它也实现了一个curve类,我将所有的线添加到我的全局arraylist中,并在我的rotate函数中旋转它们。请注意,曲线在屏幕上正确绘制。我没有添加draw方法,因为它与我的问题无关
public class Triangle implements Curve {
ArrayList<Curve> list = new ArrayList<Curve>();
public void add(Line line){
list.add(line);
}
public void rotate(double degrees) {
for(Curve c: list){
c.rotate(degrees);
}
}
公共类三角形实现曲线{
ArrayList=新建ArrayList();
公共无效添加(行){
列表。添加(行);
}
公共空间旋转(双度){
对于(曲线c:列表){
c、 旋转(度);
}
}
所以我的三角形旋转不正确。我不确定问题出在哪里。可能是在公式中旋转单个直线,但我不确定。希望有人能提供有价值的反馈
谢谢!我猜您正在尝试围绕其中心旋转三角形(默认旋转是围绕原点应用的
(0,0)
),因此您需要先平移到原点,然后应用旋转,最后平移回原始位置
这是一些代码,所以你明白了。假设你有点(三角形的顶点)p1
,而center\u triangle
是三角形的中心
//TRANSLATE TO ORIGIN
double x1 = p1.getX() - center_triangle.x;
double y1 = p1.getY() - center_triangle.y;
//APPLY ROTATION
x1 = x1 * Math.cos(angle) - y1 * Math.sin(angle));
y1 = x1 * Math.sin(angle) + y1 * Math.cos(angle));
//TRANSLATE BACK
p1.setLocation(x1 + center.x, y1 + center.y);
必须对三角形的每个点执行此操作
//TRANSLATE TO ORIGIN
double x1 = p1.getX() - center_triangle.x;
double y1 = p1.getY() - center_triangle.y;
//APPLY ROTATION
x1 = x1 * Math.cos(angle) - y1 * Math.sin(angle));
y1 = x1 * Math.sin(angle) + y1 * Math.cos(angle));
//TRANSLATE BACK
p1.setLocation(x1 + center.x, y1 + center.y);
注意:
使用
Math.toRadians(度)
代替degrees*(Math.PI/180)
我是否应该将每条直线转换为原点?因此,最好将Line类中的旋转函数更改为转换为原点,旋转,然后再向后转换,但我不知道三角形的中心。请在triangle
类中执行此操作。