Java-анімацыі і пераазначэнне метадаў малявання і абнаўлення

Так што на дадзены момант я спрабую аніміраваць розныя парадкі крывых Без'е і сярэднія, якія робяць іх, але я даволі новым для графікі ў Java. Я разумею, як фарбы і перафарбаваць працу, але я не магу зразумець, як выйсці з гэтай сітуацыі.

Кропкі крывой Без'е вызначаюцца па колькасці клікаў карыстальнікаў тут, і перафарбаваць() выклікаецца ў 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 па-за. Мой пяты заказ адзін мае нешта накшталт 11 Сярэдзіны пастаянна разлічваецца. Відавочна, што маё разуменьне гэтай частцы Явы графікі сумнеўна у лепшым выпадку, так што любая кропка ў правільным кірунку была б вельмі ўдзячны. Калі я знайду што-небудзь у маім даследаванні я буду абнаўляць гэтае пытанне.

Дзякуй за любую дапамогу.

1
Перакрыцце фарба() і абнаўленне() з'яўляецца паняцце AWT. Вы б не зрабіць гэта пры выкарыстанні Swing. Карыстацкая карціна робяцца ў метадзе paintComponent() ваш карыстацкі кампанент.
дададзена аўтар camickr, крыніца
Што не працуе для вас?
дададзена аўтар Perception, крыніца
Ах, так што вы хочаце анімацыю і не толькі затрымку. Перакрыцце фарба не збіраецца скарачаць яго, вы будзеце мець рэалізаваць цыкл рэндэрынгу. Вы можаце Google анімацыі метады Java або паглядзіце на любы Trident або апрацоўкі, як вялікія бібліятэкі для Java 2D анімацыі.
дададзена аўтар Perception, крыніца
Я не магу зразумець, як гэта рэалізаваць так, каб Без'е функцыі анімацыі намаляваных ліній, а не проста іх афарбоўкі. перафарбаваць() з дапамогай таймера проста малюе ўсе радкі адразу ж, што і варта было чакаць, паколькі ўсе яны ў цыкле звонку фарбай, але я не бачу, куды яшчэ пакласці іх. У мяне 5 з гэтых Без'е метадаў у залежнасці ад таго, які абраны для анімацыі. Я сапраўды не разумею, як я павінен быць у стане перафарбоўваць лініі так, што гэта анімацыя, асабліва з праграмай ўжо малявання кропак у фарбе.
дададзена аўтар Smeasum, крыніца

1 адказы

Забудзьцеся таймер. Паспрабуйце paintComponent.

Аб'ектна-арыентаванае, дапаможа падтрымаць агляд, спрашчаючы лік зменных.

  • Зрабіце базавы клас Без'е з фарбай (Graphics) {} і onMouse (MouseEvent) {}.
  • <Літый> Выведзіце Bezier1, ~ 2, ~ 3 і гэтак далей.
  • І ёсць зменныя Без'е bezier2 = новы Bezier2 (); ...
  • І ў вашым paintCompont выкліку bezier2.paint (г).

Тады паспрабуйце <моцны> перафарбаваць (10L) або так у вашу апрацоўку мышы. Эксперымент, каб даведацца (paintImmediate і гэтак далей).

1
дададзена
paintComponent() +1
дададзена аўтар mKorbel, крыніца
Я буду глядзець на гэта. Я проста не магу атрымаць іншыя з іх, хоць, так як яны не называюцца, калі больш ачкоў не малююцца. 4 балы за 3-га парадку і 5 для 4 і г.д ... У любым выпадку, вельмі карысна цяпер.
дададзена аўтар Smeasum, крыніца