Java 围绕x和y轴旋转多边形

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.

当我改变多边形的值时,我遇到了旋转后坐标不完全正确的问题,因为我的许多计算使用双精度,并且构造函数只接受int[]。有没有更好的方法来达到同样的效果

注意,通过缩放实现顶点在帧外“z方向”的旋转;并且每个字母的坐标轴相对于框架的坐标轴具有相对位置

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方向平移时进行缩放。