围绕x和y轴旋转多边形

时间:2011-04-09 15:43:56

标签: java rotation transformation

我在旋转后坐标不正确的问题因为我更改了多边形的值,因为我的许多计算都使用了双精度而Polygon构造函数只接受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();
    }
}

2 个答案:

答案 0 :(得分:3)

除了重构和更改幻数之外,请考虑使用Path2D.Double对象而不是Polygon。

答案 1 :(得分:2)

使用AffineTransform在与所需轴正交的方向上缩放,如answer中提到的那样。另请注意,Polygon使用translate()方法可以显着简化您的代码。

附录:这里有两种可能增强错觉的技巧:

  1. 交替显示和隐藏所选轴,Shape在行程极限处改变方向。这可以通过改变每个画面的顺序来实现。

  2. 通过否定正交方向上的比例来反转Shape,因为它会改变方向。例如,当Shape位于 x 轴后面时,请使用scale(1, -scaleFactor),这会影响垂直尺寸。