2011-04-09 20 views
2

ポリゴンの値を変更すると、回転後に座標が正しくない問題が発生します。計算の多くは2倍になり、Polygonコンストラクタはint[]しか使用しないためです。これについて、同じ結果を達成するためのよりよい方法がありますか?x軸とy軸の周りのポリゴンを回転する

"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(); 
    } 
} 
+3

これらのマジックナンバーはどれくらい加算され、減算されますか? – luqui

+1

2番目のことは(魔法の数字を取り除いた後に)、コードをリファクタリングすることです。なぜなら、非常に多くの不必要な繰り返しがあり、デバッグをさらに困難にするようです。 [X軸回りの垂直形状を回転]の –

+0

可能重複(http://stackoverflow.com/questions/5593066/rotating-a-shape-vertically-around-the-x-axis) – trashgod

答えて

3

、代わりにPolygonのはPath2D.Doubleオブジェクトを使用することを検討してください。

+1

+1の再調整。私は、どんな[Shape'](http://download.oracle.com/javase/6/docs/api/java/awt/Shape.html)でも合理的な選択肢になると主張しています。 – trashgod

+0

@trashgod:私は同意しますが、Polygon **はインターフェイスを実装している点で**形状ですが、それには昔ながらの匂いがあることに驚いています。 –

+0

ああ、私はあなたが何を意味するかを見ます:それは1.0からの遺産です。残りのほとんどは 'Graphics2D'で始まったようです。ありがとう! – trashgod

2

ご質問のanswerに記載されているように、AffineTransformを使用して目的の軸と直交する方向にスケールします。また、Polygonには、コードを大幅に簡略化する方法があります(translate())。

補遺:

  1. あるいはその移動の限界にShape変化方向として選択された軸を表示し、非表示:ここで錯覚を増強することができる2つの技術です。これは、それぞれが描かれる順序を変えることで達成できます。

  2. Shapeを反転するには、直交方向のスケールを無効にして方向を変更します。たとえば、Shapex軸の後ろにある場合は、scale(1, -scaleFactor)を使用します。これは垂直サイズに影響します。

+0

私はAffineTransformを調べましたが、直交方向にどのようにスケールするのか分かりません。 –

+0

[直交](http://en.wikipedia.org/wiki/Orthogonality)は垂直を意味します。 _x_軸周りの回転をシミュレートする場合は、_y_方向に平行移動しながら拡大/縮小する必要があります。 – trashgod

関連する問題