动画两个Point对象之间的线

时间:2011-02-15 22:06:43

标签: java animation

在某种方式中在两个Point对象之间绘制直线的最简单方法是什么 看起来我手工实时绘制那条线?

例如:

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

如何将这些点与“移动”线连接?

换句话说,我想让用户感受某种“动作”。有没有一种简单的方法可以做到这一点?

3 个答案:

答案 0 :(得分:3)

给定两点,您可以确定连接它们的线的方程。线的方程是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 + cy = c。现在我们知道这一点,我们只需要知道y = c和5 <= x <= 15的点。只需以正常方式绘制每个点(在this处查看确切的方法),并在绘制每个点之间调用Thread.sleep()。在这种情况下,您只有11个点可以绘制,因此每100毫秒绘制1个点是有意义的。有关Thread.sleep()的详细信息,请参阅here

编辑:由于Thread.sleep()无法在EDT上发挥作用,请转而考虑javax.swing.Timer,正如Uhlen建议的那样。

答案 1 :(得分:2)

根据Chinmay Kanchi的回答,你需要创造一种动画的感觉。如上所述,在Uhlen的评论中,你应该在使用EDT时使用Swing的Timer。举例说明如何使用Timer。让我们假设我们有一个面板,我们希望它在例如按钮单击,因此我们需要通过增加其大小来滑动打开它的动画。下面是一个示例,显示了如何使用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);

答案 2 :(得分:0)

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 ++和使用向量,但它是我们想要的理论。这允许多行而不仅仅是一行。