1

我是一个完整的处理初学者,并试图让一排椭圆跟随鼠标的路径,它们的边缘接触,但不重叠。

我的第一个练习是使用一条线在数组中跟踪鼠标历史记录,注释掉的线也在每个索引处添加一个椭圆:

ArrayList <PVector> history;
float preX; 
float preY;

void setup() {
  size(1024, 1024);
  history = new ArrayList <PVector> ();
}

void draw() {
  background(255);

  for(int i=1; i<history.size(); i++){
    //ellipse(history.get(i).x, history.get(i).y, 50,50);

      PVector pointA = history.get(i-1);
      PVector pointB = history.get(i);
      line(pointA.x, pointA.y, pointB.x, pointB.y);
  }
}

void mouseDragged() {
  preX= mouseX;
  preY= mouseY;
  history.add(new PVector(mouseX,mouseY));
}

我想我应该定义一个半径变量并使用 dist() 来计算当前鼠标位置与沿鼠标历史绘制的最后一个椭圆之间的距离,然后使用 if 语句仅在该距离 == 半径 * 时绘制椭圆2,但是当我尝试将其转换为处理代码时会非常卡住。任何人都可以帮助我开始吗?我在其他地方找不到提示时遇到了很多麻烦 - 即使只是朝着正确的方向推动也会非常感激!

4

2 回答 2

0

我想我应该定义一个半径变量并使用 dist() 来计算当前鼠标位置与沿鼠标历史绘制的最后一个椭圆之间的距离,然后使用 if 语句仅在该距离 == 半径 * 时绘制椭圆2

这听起来是一个非常好的计划。我能给你的最好建议是把你的问题分解成更小的部分,一次一个地处理这些部分。

例如,您可以从仅在某处显示硬编码圆圈的基本草图开始,然后打印出它与鼠标之间的距离吗?以此为基础。你能不能让圆圈通常是红色的,但当鼠标离它一定距离时变成绿色?现在你可以让它变成绿色时画一个新的圆圈吗?

提示:如果你检查距离是否完全等于半径,你只检查了非常小的一组位置,鼠标可能不会那么精确。相反,您可能想检查距离是否在半径之外。您可能会发现此碰撞检测教程很有用。

于 2017-08-26T23:28:41.370 回答
0
void mouseDragged() {
  if(dist(preX,preY,mouseX,mouseY)>=50){
  float angle=atan2(mouseX-preX,mouseY-preY);
  preX+=sin(angle)*50;
  preY+=cos(angle)*50;
  history.add(new PVector(preX,preY));
  }
}
于 2017-09-03T02:43:09.533 回答