Java animatsiyasi va bo'yoq va yangilanish usullarini bekor qilish

Xullas, men bezierli chiziqlarning turli buyurtmalarini va ularni yaratadigan o'rta nuqtalarni jonlantirishga harakat qilmoqdaman, lekin men Java'dagi grafikalar uchun juda yangi. Men bo'yoqni qanday qilib qayta ishlayotganimni tushunaman, lekin bu vaziyatdan qanday chiqish kerakligini tushunolmayman.

Kichkina egri chiziqlari bu yerda foydalanuvchining bosishi bilan belgilanadi va repaint() funktsiyasida chaqiriladi.

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

Pastda chaqirilgan vazifalar bu erda hisoblangan va chizilgan chizilgan egri chiziqlarga o'tadi.

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

Men shuni bilamanki, men bu usullarning ichiga kirmasligim kerak, aksincha bo'yoqlarda. Biroq, men bu vazifalarning 5-qismini bo'yashga qanday kiritish kerakligiga ishonchim komil emas va yangilash uchun boshqa usulni o'zgartirsam, foydalanuvchining keyingi tugmachaga o'tishni xohlamagan nuqtalarni hech qachon o'chira olmaydi. ballarni tanlash. Ko'rib turganingizdek, men asosiy temir taymerni o'rnatishga harakat qilardim, lekin animatsiya uchun bu holatda ishlayotganiga ishonchim komil emas.

Bu bezier funktsiyalarini bajarish uchun buni olishning biron bir usuli bormi? Men faqat chiziqlarni qanday qilib olishim mumkinligini ko'rmayapman. Mening 5-chi tartibida 11 ta o'rta nuqtadan doimiy ravishda hisoblanadigan narsa bor. Shubhasiz java grafikasining bu qismini yaxshi tushunishim shubhasiz, shuning uchun to'g'ri yo'nalishdagi har qanday nuqta juda qadrlanadi. Mening tadqiqotimda biror narsa topsam, savolni yangilayman.

Har qanday yordam uchun rahmat.

1
Paint() va update() funksiyalarini bekor qilish AWT tushunchasi. Swingdan foydalanayotganda buni qilolmaysiz. Maxsus rasm sizning maxsus komponentingizning paintComponent() usulida amalga oshiriladi.
qo'shib qo'ydi muallif camickr, manba
Siz uchun nima ish qilmayapti?
qo'shib qo'ydi muallif Perception, manba
Eh, shuning uchun sizga faqat bir kechikish emas, balki animatsiya kerak. Ustini bekor qilish, uni kesmaguncha, sizni renderlash loopi amalga oshirasiz. Java Java animatsiyasi texnikasi yoki Trident yoki Processing ga, Java 2D animatsiyasi uchun ham ajoyib kutubxonalarga murojaat qilishingiz mumkin.
qo'shib qo'ydi muallif Perception, manba
Buni qanday amalga oshirish mumkinligini tushunolmayman, shuning uchun bezier funktsiyalari chizilgan chiziqlarni animatsiya bilan bezash o'rniga jonlantiradi. taymer yordamida repaint() funksiyasidan foydalanib, barcha satrlarni bir vaqtning o'zida tortadi, bu kutilgan bo'lishi kerak, chunki ularning hammasi bo'yoqning tashqari qismida joylashgan bo'lsa-da, ularni qaerga qo'yish kerakligini bilmayman. Qaysi tartibni jonlantirish uchun tanlanganiga qarab, bu bezori uslublarning 5-si bor. Men chiziqlarni chizishni qanday qilib o'zgartirishim kerakligini tushunmayapman, ayniqsa, animatsiya, ayniqsa, bo'yoqlarni ko'rsatadigan dastur.
qo'shib qo'ydi muallif Smeasum, manba

1 javoblar

Taymerni unuting. PaintComponent harakat qilib ko'ring.

Ob'ektga yo'naltirilgan parametrlar o'zgaruvchan sonlarni soddalashtirib, umumiy fikrni saqlashga yordam beradi.

  • Bo'yoqli Bezierni bo'yoq (Graphics) {} va onMouse (MouseEvent) {} yordamida qiling.
  • Bezier1, ~ 2, ~ 3 va shunga o'xshashlarni chiqaring.
  • Va o'zgaruvchilar Bezier bezier2 = yangi Bezier2 (); ...
  • va siz boyaCompont chaqirig'ida bezier2.paint (g).

Keyin sichqoncha bilan ishlashda repaint (10L) yoki harakat qilib ko'ring. O'rganish uchun tajriba (bo'yinturuq va boshqalar).

1
qo'shib qo'ydi
paintComponent() +1
qo'shib qo'ydi muallif mKorbel, manba
Men bunga qarayman. Men faqatgina boshqa kishilarni keltira olmayman, chunki ular ko'proq ball chiqarilmaguncha chaqirilmaydi. Uchinchi o'ringa 4 ball va 4-chi uchun 4-chi va hokazo ... Har ikkala usul ham hozirgacha juda foydali.
qo'shib qo'ydi muallif Smeasum, manba