Анимация линии между двумя точечными объектами - PullRequest
0 голосов
/ 16 февраля 2011

Какой самый простой способ нарисовать линию между двумя точечными объектами так, как если бы я рисовал эту линию в реальном времени вручную?

Например:

Point a = new Point(5,20);
Point b = new Point(15,20);

Как мне соединить эти точки «движущейся» линией?

Другими словами, я хочу, чтобы пользователь почувствовал какое-то «движение».Есть ли простой способ сделать это?

Ответы [ 3 ]

3 голосов
/ 16 февраля 2011

Учитывая две точки, вы можете определить уравнение линии, соединяющей их.Уравнение прямой имеет вид y = mx + c, где m - наклон, а c - точка пересечения y.

Итак, учитывая ваши две точки (5,20) и (15,20), мы сначала определим m.

m = (y2-y1)/(x2-x1)
  = (20-20)/(15-5)
  = (0)/10
  = 0

Подставляя в уравнение для прямой линии, получим y = 0x + c или y = c.Теперь, когда мы знаем это, нам просто нужно знать точки, где y = c и 5 <= x <= 15.Просто нарисуйте каждую из этих точек обычным способом (точный метод посмотрите на <a href="http://download.oracle.com/javase/tutorial/2d/geometry/examples/ShapesDemo2D.java" rel="nofollow"> this ) с вызовом Thread.sleep() между рисованием каждой точки.В этом случае у вас есть только 11 точек для рисования, поэтому имеет смысл рисовать 1 точку каждые 100 мс.Подробнее о Thread.sleep() см. здесь .

РЕДАКТИРОВАТЬ: поскольку Thread.sleep() не будет работать с EDT, посмотрите вместо этого javax.swing.Timer ,как предположила Улен.

2 голосов
/ 16 февраля 2011

Следуя ответу Чинмая Канчи, вам нужно создать ощущение анимации. Как упоминалось выше в комментариях Улена, вы должны использовать таймер Swing при работе над EDT. Чтобы дать вам пример того, как использовать таймер. Предположим, у нас есть панель, и мы хотим, чтобы она открывалась, например, на панели. щелчок кнопки, поэтому нам нужно анимировать его скольжение, увеличив его размер. Ниже приведен пример, показывающий, как вы будете использовать Timer для выполнения операций.

this.extendingTimer = new Timer(0, new ActionListener()
{
    public void actionPerformed(ActionEvent e)
    {
       //assume sliding is vertical     
       int value = maximumHeight;
       //make sure the size will not be bigger then allowed maximum
       if(currentExtensionSize + extensionRate >= value)
       {
          currentExtensionSize = value;
          stopExtending();
       }
       else
          currentExtensionSize += extensionRate;
       setSize(new Dimension(maximumWidth, currentExtensionSize));
    }
});
extendingTimer.setInitialDelay(0);
extendingTimer.setDelay(100);
extendingTimer.setRepeats(true);
0 голосов
/ 23 марта 2012
int lineCount = 0; //global
// timer calls the below

xLocation = (*a)[a->size()-1] * timeSoFar / duration ;
    if(xLocation > (*a)[lineCount+1]){
        lineCount++;        
    }
    double m = ((*b)[lineCount+1] - (*b)[lineCount])/((*a)[lineCount+1]-(*a)[lineCount]);
    double yIntercept = (*b)[lineCount]-m*(*a)[lineCount];
    yLocation = m * xLocation + yIntercept;
    xLocation = (yLocation - yIntercept) / m;

это в c ++ и использует векторы, но это теория, которую мы хотим.Это позволяет использовать несколько строк, а не одну.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...