2011-10-28 56 views
1

所以目前我正在嘗試使貝塞爾曲線的不同順序和中點組合起來,但對於Java中的圖形我很新。我知道如何繪畫和重繪工作,但我無法弄清楚如何擺脫這種情況。Java動畫和覆蓋繪製和更新方法

貝塞爾曲線點由用戶點擊決定,並在mouseEvent處調用repaint()。

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個這些函數,我不知道如何放置畫圖,如果我改變另一種方法來更新,那麼當我想移動到下一個時,它將永遠不會消除用戶點擊的點選點。你可以看到我試圖把一個基本的搖擺計時器,但我甚至不知道這是否會在這種情況下的動畫工作。

有沒有什麼辦法讓貝塞爾函數的內部工作?我只是不明白我能如何得出這些提綱。我的第5順序有11箇中點不斷計算。顯然,我對Java圖形這部分的理解最多是不穩定的,所以任何正確的方向都將不勝感激。如果我在研究中發現任何問題,我會更新問題。

感謝您的任何幫助。

+0

什麼不適合你? – Perception

+0

我無法弄清楚如何實現這個功能,這樣bezier函數就可以繪製線條而不是僅僅繪製它們。重繪()使用定時器只是一次繪製所有的行,這是預料之中,因爲他們都在油漆之外的for循環,但我沒有看到放置它們的地方。我有5個bezier方法取決於哪個順序被選爲動畫。 我真的不明白我應該如何重畫線條,以便它是一個動畫,尤其是當程序已經在繪畫中繪製點時。 – Smeasum

+0

啊,所以你想要一個動畫而不僅僅是一個延遲。重寫paint不會削減它,你將實現一個渲染循環。你可以谷歌的Java動畫技術或看看三叉戟或處理,這兩個偉大的Java 2D動畫庫。 – Perception

回答

1

忘記計時器。嘗試paintComponent。面向對象將有助於保持概覽,簡化變量的數量。

  • 使用paint(Graphics){}和onMouse(MouseEvent){}創建基類Bezier。
  • 導出貝塞爾1,〜2,〜3等。
  • 並且有變量Bezier bezier2 = new Bezier2(); ...
  • 並在您的paintCompont調用bezier2.paint(g)。

然後嘗試重繪(10L)左右您的鼠標處理。試驗學習(paintImmediate等)。

+0

我會研究一下。我不能只是推導出其他的,因爲除非得到更多的分數,否則它們不會被調用。第三次拿4分,第四次拿5分...... 無論哪種方式,現在都非常有幫助。 – Smeasum

+0

paintComponent()+1 – mKorbel