0

我是处理的新手,我正在尝试lerp处理处理中的功能。基本上我想做的是,点击屏幕上的不同点,这些位置被存储在一个数组中。当用户点击 时,存储的动作会在点之间以平滑enter的移动方式回放。ellipse我的问题是,当我单击 Enter 时,我得到“算术异常为零”。你能指导我我错过了什么吗?谢谢。

final static int numFrames = 30; //frames between keyframes
final static int numKeyFrames = 1; //frames between keyframes
Point[] keyFrames;
Point[] frames;

void setup()  
{
  size(640, 480);
  frameRate(30);
  LinearInterp();
}

void mouseClicked()
{
  stroke(0);
  strokeWeight(8);
  for(int i=0; i<numKeyFrames; i++)
  {
    keyFrames = new Point[numKeyFrames];
    keyFrames[i] = new Point(mouseX,mouseY);
    point(keyFrames[i].x,keyFrames[i].y);
    println("Mouse Coordinates are: " + keyFrames[i]);
  }
}

void LinearInterp() 
{
  frames = new Point[numFrames*(numKeyFrames-1)]; 
  for (int kf = 0; kf< numKeyFrames-1; kf++)
  {
    Point p0 = keyFrames[kf];
    Point p1 = keyFrames[kf+1];
    for (int f =0; f<numFrames; f++)
    {
      float a = f*1.0/numFrames;
      int newX = int(p0.x * (1-a) + p1.x * a);
      int newY = int(p0.y * (1-a) + p1.y * a);
      frames[f+(kf*numFrames)] = new Point(newX,newY);
    }
  }
}

void animateFrames()
{
  stroke(187);
  strokeWeight(10);
  int i = frameCount % frames.length;  
  point(frames[i].x,frames[i].y);
}

void drawFrames() 
{
  stroke(187);
  strokeWeight(2);
  for (int i=0; i<frames.length; i++)
  {
    point(frames[i].x,frames[i].y);
  }
}

void draw() 
{
  if(keyPressed)
  {
    if(key == ENTER)
    {
      drawFrames();
      animateFrames();
    }
  }
}
4

1 回答 1

1

你为什么删除你的最后一个问题?请不要在有人花时间回答问题后删除问题。

就像我在上一个问题中所说的那样,您需要存储您所在旅程的“腿”的索引。您还需要存储该点应该沿着那条腿多远。当您到达下一个点时,增加索引并重置百分比。

在任何情况下,您都需要将此问题分解为更小的步骤。你能创建一个程序来显示一个从一个硬编码点到另一个点的圆圈吗?从此开始,无需担心用户输入。在继续之前让它完美地工作。然后让一个程序运行,显示一个从硬编码点移动到用户点击的点的圆圈。让它完美地工作。然后得到一个程序,显示在两次用户点击之间移动的圆圈。让它完美地工作。注意到一个模式了吗?

于 2017-02-26T16:14:11.430 回答