Java animasyonu ve boyayı geçersiz kılma ve güncelleme yöntemleri

Şu anda bezier eğrilerinin farklı düzenlerini ve onları oluşturan orta noktaları canlandırmaya çalışıyorum ama Java'daki grafiklere oldukça yeni. Boya ve rötuşun nasıl çalıştığını anlıyorum ama bu durumdan nasıl çıkacağımı anlayamıyorum.

Bezier eğri noktaları, kullanıcı tarafından buraya tıklatılarak kararlaştırılır ve mouseEvent'de repaint() çağrılır.

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);
}

Altta çağrılan fonksiyonlar burada hesaplanmış ve çizilmiş bezier eğrilerine gider.

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));
    }
}

Bu yüzden, bu yöntemlerin içinde çizim yapmamam gerektiğini, daha ziyade boyada olmam gerektiğini biliyorum. Ancak, bu fonksiyonlardan 5 tanesini boyaya nasıl yerleştireceğimi bilmiyorum ve eğer güncellemek için diğer yöntemi değiştirirsem, bir dahaki sefere geçmek istediğimde kullanıcının tıkladığı noktaları silmez. puan seçimi. Gördüğünüz gibi, temel bir salıncak zamanlayıcısı koymaya çalıştım ama bu durumun animasyon için çalışıp çalışmadığından emin değilim.

Bunu bezier işlevlerinin içinde çalışmak için herhangi bir yolu var mı? Çizgileri nasıl çıkarabileceğimi anlamıyorum. Beşinci siparişim, sürekli olarak hesaplanan 11 orta nokta gibi bir şeye sahip. Açıkçası, java grafiğin bu kısmındaki anlayışım en iyi ihtimalle titrek, bu yüzden doğru yönde herhangi bir nokta büyük ölçüde takdir edilecektir. Araştırmamda bir şey bulursam soruyu güncelleyeceğim.

Herhangi bir yardım için teşekkürler.

1
Aşırı boya() ve güncelleme (), bir AWT kavramdır. Swing kullanırken bunu yapmazdınız. Özel boyama, özel bileşeninizin paintComponent() yönteminde yapılır.
katma yazar camickr, kaynak
Ne senin için çalışmıyor?
katma yazar Perception, kaynak
Ah, bir animasyon istiyorsun, sadece bir gecikme değil. Geçersiz kılan boya onu kesmeyecek, bir oluşturma döngüsü uygulayacaksınız. Google Java animasyon tekniklerini kullanabilir veya Java 2D animasyon için hem harika kütüphaneler hem de Trident ya da Processing'e göz atabilirsiniz.
katma yazar Perception, kaynak
Bunu nasıl uygulayacağımı anlayamıyorum, böylece bezier işlevleri sadece resim yapmak yerine çizilmiş çizgileri canlandırır. zamanlayıcıyı kullanarak repaint() sadece tüm satırları bir kerede çizer, bu da hepsinin boya dışında bir döngü içinde olduğu için beklenecek, ama onları başka bir yere koyamıyorum. Hangi sıranın harekete geçirileceğine bağlı olarak bu bezier yöntemlerden 5 tane var. Çizgiyi yeniden çizebilmem gerektiğini gerçekten anlayamıyorum, özellikle bir programdır, özellikle de programda zaten boya bulunan noktalar var.
katma yazar Smeasum, kaynak

1 cevap

Zamanlayıcıyı unut. PaintComponent'i deneyin.

Nesne Yönelimli, genel bakış açısını korumaya yardımcı olur, değişken sayısını basitleştirir.

  • Boya ile bir temel sınıf Bezier (Grafik) {} ve onMouse (MouseEvent) {}.
  • yapın.
  • Bezier1, ~ 2, ~ 3 vb. türet.
  • Ve değişkenler var Bezier bezier2 = yeni Bezier2 (); ...
  • Ve boyamanızdaCompont call bezier2.paint (g).

Ardından, fare işleminizde yeniden boya (10L) veya kullanmayı deneyin. Öğrenmek için deney (paintImmediate ve benzeri).

1
katma
paintComponent() +1
katma yazar mKorbel, kaynak
Buna bakacağım. Diğerlerini değil, daha fazla nokta çizilmedikçe çağrılmadıklarından türemem. Bir üçüncü sıra için 4 puan ve 4 için 4, vb ... Her iki durumda da, şimdi için çok yararlı.
katma yazar Smeasum, kaynak