2011-10-28 8 views
1

現在、私はさまざまなベジエ曲線の順序とそれらを作る中間点をアニメーション化しようとしていますが、Javaのグラフィックはかなり新しいです。私はペイントと再ペイントの仕組みを理解していますが、この状況から抜け出す方法を理解することはできません。Javaアニメーションとペイントと更新メソッドのオーバーライド

ベジエ曲線のポイントは、ここでのユーザーのクリックによって決定され、repaint()はmouseEventで呼び出されます。

public void paint(Graphics g) { 
    initgr(); 
    int left = iX(-rWidth/2), right = iX(rWidth/2), bottom = iY(-rHeight/2), top = iY(rHeight/2); 
    g.drawRect(left, top, right - left, bottom - top); 

    for (int i = 0; i < np; i++) { 
     // Show tiny rectangle around point: 
     g.drawRect(iX(P[i].x) - 2, iY(P[i].y) - 2, 4, 4); 
     if (i > 0) 
      // Draw line P[i-1]P[i]: 
      g.drawLine(iX(P[i - 1].x), iY(P[i - 1].y), iX(P[i].x), 
        iY(P[i].y)); 
    } 

    if (np == 2 && order == 1) 
     bezier1(g, P, gran); 
    if (np == 3 && order == 2) 
     bezier2(g, P, gran); 
    if (np == 4 && order == 3) 
     bezier3(g, P, gran); 
    if (np == 5 && order == 4) 
     bezier4(g, P, gran); 
    if (np == 6 && order == 5) 
     bezier5(g, P, gran); 
} 

ここでは、呼び出された関数は計算され、描画されたベジェ曲線に移動します。

void bezier3(Graphics g, Point2D[] p, int n) { 
    javax.swing.Timer timer = new javax.swing.Timer(100, 
      new TimerListener()); 
    timer.setDelay(39); 
    timer.start(); 
    float dt = 1.0F/n, cx3 = -p[0].x + 3 * (p[1].x - p[2].x) + p[3].x, cy3 = -p[0].y 
      + 3 * (p[1].y - p[2].y) + p[3].y, cx2 = 3 * (p[0].x - 2 
      * p[1].x + p[2].x), cy2 = 3 * (p[0].y - 2 * p[1].y + p[2].y), cx1 = 3 * (p[1].x - p[0].x), cy1 = 3 * (p[1].y - p[0].y), cx0 = p[0].x, cy0 = p[0].y, x = p[0].x, y = p[0].y, x0, y0, x2, y2; 
    for (int i = 1; i <= n; i++) { 

     float t = i * dt; 

     x0 = x; 
     y0 = y; 
     x = ((cx3 * t + cx2) * t + cx1) * t + cx0; 
     y = ((cy3 * t + cy2) * t + cy1) * t + cy0; 
     // x2 = ((cx3 * (.5F*t) + cx2) * (.5F*t) + cx1) * (.5F*t) + cx0; 
     // y2 = ((cy3 * (.5F*t) + cy2) * (.5F*t) + cy1) * (.5F*t) + cy0; 
     x2 = p[1].x * t; 
     y2 = p[1].y * t; 

     Point2D A = tcalc(P[0], P[1], t), B = tcalc(P[2], P[3], t), C = tcalc(
       P[1], P[2], t), A1 = tcalc(A, C, t), B1 = tcalc(C, B, t); 

     g.setColor(Color.red); 
     g.drawLine(iX(x0), iY(y0), iX(x), iY(y)); 
     // paint(g); 
     g.setColor(Color.green); 
     g.drawLine(iX(A.x), iY(A.y), iX(C.x), iY(C.y)); 
     g.drawLine(iX(C.x), iY(C.y), iX(B.x), iY(B.y)); 
     g.setColor(Color.blue); 
     g.drawLine(iX(A1.x), iY(A1.y), iX(B1.x), iY(B1.y)); 
    } 
} 

私はこれらの方法の中に描くべきではなく、むしろペイントしていることを知っています。しかし、私はこれらの機能のうち、ペイントの仕方がわからない5つの機能を備えています。他の方法を変更すると、次の機能に移動したいときにユーザーがクリックしたポイントを消去しませんポイントの選択。基本的なスイングタイマーを入れようとしているのが分かりますが、この状況でアニメーションがうまくいくかどうかはわかりません。

ベジェ関数の内部でこれを動作させる方法はありますか?私はどのように私はdrawlinesを得ることができます表示されません。私の5番目のものは、11の中点が絶えず計算されているようなものです。明らかに、Javaグラフィックスのこの部分についての私の理解は、せいぜい不安定であるので、正しい方向の任意の点は非常に高く評価されるでしょう。私が研究で何かを見つけたら、私はその質問を更新するでしょう。

ありがとうございました。

+0

あなたには効果がありません。 – Perception

+0

これを実装する方法を理解することができないので、ベジェ関数は描画された線を塗りつぶすのではなく、アニメーション化します。 repaint()はタイマーを使うだけですべての行を一度に描画しますが、それらはすべてpaintの外側のforループに入っているので、予想されますが、どこに置くべきかわかりません。アニメートする順番に応じて、これらのベジェメソッドを5つ用意しています。 私は実際には線を塗り直すことができるので、それはアニメーションであると理解できません。 – Smeasum

+0

ああ、アニメーションだけでなく、遅れが欲しい。塗料をオーバーライドすることはそれをカットしません、あなたはレンダリングループを実装するつもりです。 GoogleのJavaアニメーション技術をGoogleで、またはJava 2Dアニメーションの両方の優れたライブラリであるTridentまたはProcessingをご覧ください。 – Perception

答えて

1

タイマーを忘れてしまった。 paintComponentを試してみてください。

オブジェクト指向は、変数の数を単純化するために概要を維持するのに役立ちます。

  • ペイント(グラフィックス){}とonMouse(MouseEvent){}で基本クラスのベジェを作成します。
  • Bezier1、〜2、〜3などを導出します。
  • 変数があります。Bezier bezier2 = new Bezier2(); ...
  • そしてあなたのpaintCompontでbezier2.paint(g)を呼び出してください。

次に、再塗装(10L)程度をマウス操作で試してください。学習するための実験(paintImmediateなど)。

+0

私はそれを調べます。私はもっ​​と多くの点が描かれない限り、彼らは呼び出されないので、他のものを派生させることはできません。 3位は4点、4位は5点など。 いずれにしても、現在は非常に役立ちます。 – Smeasum

+0

paintComponent()+1 – mKorbel

関連する問題