2012-02-11 18 views
3

ここで私の初めてのことです。私は、ある種の弧に沿って動く星形のアニメーションを達成しようとしています(2次元的に軌道をシミュレートしようとしています)。星座をアニメートするために、軌道アクションをタイマーとともに使用します。Javaグラフィックで円弧パスに沿って移動する形

簡単に言えば、私はjpanelのさまざまな位置にいくつかの星を描いています。星のy位置の変換は、その星がx軸からどのくらい離れているかによって決まります。これは300に初期化されます(jパネルの中心)。星が衰退地点に近づくほど、yポジションは変化しにくくなります。星がパネルの右側に到達するか、パネルの右側を通過すると、元のyの位置で左にリセットされます(醜い、わかります)。私は星が無作為に配置されているので、このようにしました。私はすべての星を同じdyで始めることはできません。もしそうなら、すべての星は代わりに自分の円弧に沿って動くでしょう。

しかし、これを実行すると、3回目のパスの後に、すべての星のx位置が小さくなります(負の範囲と見えなくなります)。元のタスクを達成するためのより良い方法の提案は大歓迎です。ありがとう。サン/オラクル2Dでデモから

private Action orbit = new AbstractAction() { 

    int declineAxis = 300; //if a stars top left x is greater than this, move downwards 
    double distFromDecline; 
    AffineTransform at = new AffineTransform(); 

    @Override 
    public void actionPerformed(ActionEvent ae) { 
     for (int i = 0; i < 12; i++) { 
      distFromDecline = Math.abs(declineAxis - stars.getStar(i).getBounds().getCenterX()); 
      if (distFromDecline <= 50) { 
       if (stars.getStar(i).getBounds().getX() < declineAxis) { 
        at.translate(5, -2); 
       } else { 
        at.translate(5, 2); 
       } 
      } else if (distFromDecline <= 100 && distFromDecline > 50) { 
       if (stars.getStar(i).getBounds().getX() < declineAxis) { 
        at.translate(5, -3); 
       } else { 
        at.translate(5, 3); 
       } 
      } else if (distFromDecline <= 200 && distFromDecline > 100) { 
       if (stars.getStar(i).getBounds().getX() < declineAxis) { 
        at.translate(5, -4); 
       } else { 
        at.translate(5, 4); 
       } 
      } else if (distFromDecline >200) { 
       if (stars.getStar(i).getBounds().getX() < declineAxis) { 
        at.translate(5, -5); 
       } else { 
        at.translate(5, 5); 
       } 
      } 
      stars.move(at, i); 
     } 
    } 
}; 
public class Stars { 

private int[] yOrigins; 
private Path2D[] stars; 
private Random rand = new Random(); 

public Stars(int n) { 
    stars = new Path2D[n]; 
    yOrigins = new int[n]; 
    int dx = 700/n; 
    int x = 0; 
    for (int i = 0; i < n; i++) { 
     int y = rand.nextInt(401); 
     generateStar(i, x, y); 
     yOrigins[i] = y; 
     x += dx; 
    } 
} 

private void generateStar(int i, int x, int y) { 
    stars[i] = new Path2D.Double(); 
    Path2D.Double cur = (Path2D.Double) stars[i]; 
    cur.moveTo(x, y); 
    cur.lineTo(cur.getCurrentPoint().getX() + 6, y - 2); 
    cur.lineTo(cur.getCurrentPoint().getX() + 2, cur.getCurrentPoint().getY() - 6); 
    cur.lineTo(cur.getCurrentPoint().getX() + 2, cur.getCurrentPoint().getY() + 6); 
    cur.lineTo(cur.getCurrentPoint().getX() + 6, cur.getCurrentPoint().getY() + 2); 
    cur.lineTo(cur.getCurrentPoint().getX() - 6, cur.getCurrentPoint().getY() + 2); 
    cur.lineTo(cur.getCurrentPoint().getX() - 2, cur.getCurrentPoint().getY() + 6); 
    cur.lineTo(cur.getCurrentPoint().getX() - 2, cur.getCurrentPoint().getY() - 6); 
    cur.closePath(); 
} 

public void paintStars(Graphics2D g) { 
    //super.paintComponent(g); 
    g.setColor(new Color(246, 246, 255)); 
    for (int i = 0; i < stars.length; i++) { 
     g.fill(stars[i]); 
    } 
} 

public Shape getStar(int i) { 
    return stars[i]; 
} 

void move(AffineTransform at, int i) { 
    stars[i] = (Path2D) stars[i].createTransformedShape(at); 
    System.out.println(i+": " + stars[i].getBounds()); 
    if(stars[i].getBounds().getX()>700){ 
     at.translate(-(stars[i].getBounds().x+stars[i].getBounds().getWidth()), yOrigins[i]); 
     stars[i] = (Path2D) at.createTransformedShape(stars[i]); 
    } 
} 

}

+0

はSOへようこそ!もっと早く助けを求めるには、[SSCCE](http://sscce.org/)を投稿してください。 –

答えて

3

java.awt.geom.FlatteningPathIterator http://docs.oracle.com/javase/6/docs/api/java/awt/geom/FlatteningPathIterator.html

あなたの円弧(または任意の他の形状)を通過させ、位置の星にポイントを使用しています。ここ

あなたが使用することができます

星FRM http://java-sl.com/shapes.html

+0

リンクは[Archive.org](https://web.archive.org/web/20131113102448/http://java-sl.com/tip_flatteningpathiterator_moving_shape.html)からのみ入手できますが、非常に便利です。 – mhvelplund

2

WarpImagejava2d/demos/Images/WarpImage.javaは、PathIteratorを用いCubicCurve2Dに従うアニメーションの魅力的な一例です。あなたはそれが何らかの指針を提供するかどうかを見るかもしれませ

+0

@stanislavl両方のおかげで、PathIteratorを使用して私の問題を解決しました。手に入る前にこれらの機能の使用を意識していませんでした。 – user1203349

関連する問題