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 таких функцій, я не знаю, як вкласти фарбу, і якщо я зміню другу методи оновлення, то я ніколи не буду стирати бали, які користувач натискає, коли хочу перейти до наступного вибір точок. Ви можете бачити, я намагався встановити базовий таймер зміни, але я навіть не впевнений, що це буде працювати в цій ситуації для анімації.

Чи існує якийсь спосіб отримати це для роботи всередині функції bezier? Я просто не бачу, як я можу витягнути низку очок. Мій 5-й порядок має щось подібне до 11 середніх пунктів, які постійно розраховуються. Очевидно, що моє розуміння цієї частини Java-графіки в кращому випадку є хиткими, тому будь-яка точка в правильному напрямку була б дуже вдячна. Якщо я знайду щось у своєму дослідженні, я оновлю питання.

Дякую за будь-яку допомогу.

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

1 Відповіді

Забудьте про таймер. Спробуй paintComponent.

Об'єкт-орієнтоване допоможе зберегти огляд, спрощуючи кількість змінних.

  • Зробіть базовий клас Bezier з фарбою (Графіка) {} і onMouse (MouseEvent) {}.
  • Виводити Bezier1, ~ 2, ~ 3 і так далі.
  • І мають змінні Bezier bezier2 = новий Bezier2 (); ...
  • А у вашій програмі paintCompont називаємо bezier2.paint (g).

Потім спробуйте перефарбувати (10 л.) , інакше в обробці миші. Експеримент із вивченням (paintImmediate і так далі).

1
додано
paintComponent() +1
додано Автор mKorbel, джерело
Я розгляну це. Я не можу просто вивести інші, хоча, оскільки їх не називають, якщо більше очок не намальовані. 4 бали за 3-й порядок і 5 для 4-го і так далі ... У будь-якому випадку, дуже корисно зараз.
додано Автор Smeasum, джерело
ІТ КПІ - Java
ІТ КПІ - Java
436 учасників