Java 围绕x和y轴旋转多边形
当我改变多边形的值时,我遇到了旋转后坐标不完全正确的问题,因为我的许多计算使用双精度,并且构造函数只接受int[]。有没有更好的方法来达到同样的效果 注意,通过缩放实现顶点在帧外“z方向”的旋转;并且每个字母的坐标轴相对于框架的坐标轴具有相对位置Java 围绕x和y轴旋转多边形,java,rotation,transformation,Java,Rotation,Transformation,当我改变多边形的值时,我遇到了旋转后坐标不完全正确的问题,因为我的许多计算使用双精度,并且构造函数只接受int[]。有没有更好的方法来达到同样的效果 注意,通过缩放实现顶点在帧外“z方向”的旋转;并且每个字母的坐标轴相对于框架的坐标轴具有相对位置 import java.awt.*; import java.awt.event.*; import java.awt.geom.AffineTransform; import java.awt.geom.Point2D; import javax.
import java.awt.*;
import java.awt.event.*;
import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;
import javax.swing.*;
import java.lang.reflect.Array;
public class test extends JPanel implements ActionListener{
double[] p1x = {200,200,260,260,220,220,260,260,200};
//int[] p1y = {300,360,360,340,340,320,320,300,300};
double[] p1y = {240,300,300,280,280,260,260,240,240};
double[] p2x = {600,600,620,620,640,640,660,660,600};
double[] p2y = {500,520,520,560,560,520,520,500,500};
double[] p3x = {500,500,560,560,540,540,520,520,500};
double[] p3y = {400,460,460,400,400,440,440,400,400};
int delay = 500;
int dx=0;
int dy=5;
int steps = 120;
Polygon t;
Timer tim = new Timer(delay,this);
public void actionPerformed(ActionEvent event){
for (int i=0; i<Array.getLength(p2x);i++){
//p2x[i] = (int) (p2x[i]*Math.cos(Math.toRadians(1))- p2y[i]*Math.sin(Math.toRadians(1)));
//p2y[i] = (int) (p2x[i]*Math.sin(Math.toRadians(1))+ p2y[i]*Math.cos(Math.toRadians(1)));;
//p2x[i] -=10;
//p3x[i]-= 10;
if(steps>100){
p2y[i] -=10;
p1y[i] +=10;
p3x[i] -=10;
if(i==0){
p1y[i] += 6;
}
if(i==1){
p2y[i] -= 1.5;
System.out.println("steps: " + steps +" "+ p2y[i]);
}
if(i==2){
p2y[i] -= 1.5;
p3x[i] -= 6;
}
if(i==3){
p2y[i] -= 6;
p1y[i] += 1.5;
p3x[i] -= 6;
}
if(i==4){
p2y[i] -= 6;
p1y[i] += 1.5;
p3x[i] -= 4.5;
}
if(i==5){
p2y[i] -= 1.5;
p1y[i] += 4.5;
p3x[i] -= 4.5;
}
if(i==6){
p2y[i] -= 1.5;
p1y[i] += 4.5;
p3x[i] -= 1.5;
}
if(i==7){
p1y[i] += 6;
p3x[i] -= 1.5;
}
if(i==8){
p1y[i] += 6;
}
}
else if((steps<=100) && (steps>80)){
p2y[i] +=10;
p1y[i] -=10;
p3x[i] +=10;
if(i==0){
p1y[i] -= 6;
}
if(i==1){
p2y[i] += 1.5;
System.out.println("steps: " + steps +" "+ p2y[i]);
}
if(i==2){
p2y[i] += 1.5;
p3x[i] += 6;
}
if(i==3){
p2y[i] += 6;
p1y[i] -= 1.5;
p3x[i] += 6;
}
if(i==4){
p3x[i] += 4.5;
p2y[i] += 6;
p1y[i] -= 1.5;
//p3x[i] += 4.5;
}
if(i==5){
p2y[i] += 1.5;
p1y[i] -= 4.5;
p3x[i] += 4.5;
}
if(i==6){
p2y[i] += 1.5;
p1y[i] -= 4.5;
p3x[i] += 1.5;
}
if(i==7){
p1y[i] -= 6;
p3x[i] += 1.5;
}
if(i==8){
p1y[i] -= 6;
}
}
else if((steps<=80) && (steps>60)){
p2y[i] -=10;
p1y[i] +=10;
p3x[i] -=10;
if(i==0){
p1y[i] += 6;
}
if(i==1){
p2y[i] -= 1.5;
System.out.println("steps: " + steps +" "+ p2y[i]);
}
if(i==2){
p2y[i] -= 1.5;
p3x[i] -= 6;
}
if(i==3){
p2y[i] -= 6;
p1y[i] += 1.5;
p3x[i] -= 6;
}
if(i==4){
p2y[i] -= 6;
p1y[i] += 1.5;
p3x[i] -= 4.5;
}
if(i==5){
p2y[i] -= 1.5;
p1y[i] += 4.5;
p3x[i] -= 4.5;
}
if(i==6){
p2y[i] -= 1.5;
p1y[i] += 4.5;
p3x[i] -= 1.5;
}
if(i==7){
p1y[i] += 6;
p3x[i] -= 1.5;
}
if(i==8){
p1y[i] += 6;
}
}
else if((steps<=60) && (steps>40)){
p2y[i] +=10;
p1y[i] -=10;
p3x[i] +=10;
if(i==0){
p1y[i] -= 6;
}
if(i==1){
p2y[i] += 1.5;
System.out.println("steps: " + steps +" "+ p2y[i]);
}
if(i==2){
p2y[i] += 1.5;
p3x[i] += 6;
}
if(i==3){
p2y[i] += 6;
p1y[i] -= 1.5;
p3x[i] += 6;
}
if(i==4){
p3x[i] += 4.5;
p2y[i] += 6;
p1y[i] -= 1.5;
//p3x[i] += 4.5;
}
if(i==5){
p2y[i] += 1.5;
p1y[i] -= 4.5;
p3x[i] += 4.5;
}
if(i==6){
p2y[i] += 1.5;
p1y[i] -= 4.5;
p3x[i] += 1.5;
}
if(i==7){
p1y[i] -= 6;
p3x[i] += 1.5;
}
if(i==8){
p1y[i] -= 6;
}
}
else if((steps<=40) && (steps>20)){
p2y[i] -=10;
p1y[i] +=10;
p3x[i] -=10;
if(i==0){
p1y[i] += 6;
}
if(i==1){
p2y[i] -= 1.5;
System.out.println("steps: " + steps +" "+ p2y[i]);
}
if(i==2){
p2y[i] -= 1.5;
p3x[i] -= 6;
}
if(i==3){
p2y[i] -= 6;
p1y[i] += 1.5;
p3x[i] -= 6;
}
if(i==4){
p2y[i] -= 6;
p1y[i] += 1.5;
p3x[i] -= 4.5;
}
if(i==5){
p2y[i] -= 1.5;
p1y[i] += 4.5;
p3x[i] -= 4.5;
}
if(i==6){
p2y[i] -= 1.5;
p1y[i] += 4.5;
p3x[i] -= 1.5;
}
if(i==7){
p1y[i] += 6;
p3x[i] -= 1.5;
}
if(i==8){
p1y[i] += 6;
}
}
else if((steps<=20) && (steps>0)){
p2y[i] +=10;
p1y[i] -=10;
p3x[i] +=10;
if(i==0){
p1y[i] -= 6;
}
if(i==1){
p2y[i] += 1.5;
System.out.println("steps: " + steps +" "+ p2y[i]);
}
if(i==2){
p2y[i] += 1.5;
p3x[i] += 6;
}
if(i==3){
p2y[i] += 6;
p1y[i] -= 1.5;
p3x[i] += 6;
}
if(i==4){
p3x[i] += 4.5;
p2y[i] += 6;
p1y[i] -= 1.5;
//p3x[i] += 4.5;
}
if(i==5){
p2y[i] += 1.5;
p1y[i] -= 4.5;
p3x[i] += 4.5;
}
if(i==6){
p2y[i] += 1.5;
p1y[i] -= 4.5;
p3x[i] += 1.5;
}
if(i==7){
p1y[i] -= 6;
p3x[i] += 1.5;
}
if(i==8){
p1y[i] -= 6;
}
}
}
repaint();
if (--steps ==0) tim.stop();
}
public void paintComponent(Graphics g ) {
super.paintComponent(g);
this.setBackground(Color.white);
g.drawLine(400, 0,400, 800);
g.drawLine(0, 400, 800, 400);
int[] p2xintarray =new int[9];
int[] p2yintarray =new int[9];
int[] p1xintarray =new int[9];
int[] p1yintarray =new int[9];
int[] p3xintarray =new int[9];
int[] p3yintarray =new int[9];
for (int i=0; i<Array.getLength(p2x);i++){
int p2xint= (int)p2x[i];
p2xintarray[i]=p2xint;
int p2yint= (int)p2y[i];
p2yintarray[i]=p2yint;
int p1xint=(int)p1x[i];
p1xintarray[i]=p1xint;
int p1yint= (int)p1y[i];
p1yintarray[i]=p1yint;
int p3xint=(int)p3x[i];
p3xintarray[i]=p3xint;
int p3yint= (int)p3y[i];
p3yintarray[i]=p3yint;
}
Polygon t = new Polygon(p2xintarray, p2yintarray, 9);
g.drawPolygon(t);
//Polygon ti = new Polygon(p2xi, p2yi, 9);
//g.drawPolygon(ti);
Polygon u = new Polygon(p3xintarray, p3yintarray, 9);
g.drawPolygon(u);
Polygon l = new Polygon(p1xintarray, p1yintarray, 9);
g.drawPolygon(l);
}
public static void main(String[] args) {
JFrame frame = new JFrame("Drawing line and a moving polygon");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
test sl = new test();
frame.getContentPane().add(sl);
frame.setSize(700,700);
frame.setVisible(true);
sl.tim.start();
}
}
除了重构和改变幻数之外,还考虑使用PATH2D.双对象而不是多边形。 用于在与所需轴正交的方向上缩放,如本节中所述。另外,请注意,Polygon有一个translate方法,可以显著简化代码
附录:这里还有两种可能增强错觉的技巧: 当形状在其移动极限处改变方向时,交替显示和隐藏选定的轴。这可以通过更改每个图形的绘制顺序来实现 通过在正交方向上取消比例,在形状改变方向时反转形状。例如,当形状位于x轴后面时,请使用scale1,-scaleFactor,这会影响垂直大小所有这些神奇的数字被加和减的是什么?在去掉这些神奇的数字之后,我要做的第二件事是重构代码,因为似乎有很多不必要的重复,这使得调试更加困难。可能的重复我只是在纸上做了数学运算,然后把它们插入,因为我无法理解仿射翻译,没有更多的时间浪费在玩它。重构代码使其在两个方向之间交替的最佳方法是什么?+1用于重新分解。我认为任何一个都是合理的选择。@trashgood:我同意,但我很惊讶地发现多边形是一种形状,因为它实现了接口,但它有一种传统的味道。啊哈,我明白你的意思了:它是1.0的传统。其余的大部分似乎都带有图形2D。谢谢我查了一下仿射变换,但我不知道如何在正交方向上缩放它。意思是垂直。如果要模拟绕x轴的旋转,则需要在y方向平移时进行缩放。