提问者:小点点

处理:椭圆鼠标跟随不重叠


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

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

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的情况下绘制椭圆,但是当我试图将其转换为处理代码时,它会变得非常卡住。有人能帮我开始吗?我在其他地方找到提示时遇到了很多麻烦——即使只是朝着正确的方向推动也将不胜感激!


共2个答案

匿名用户

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

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

例如,你能从一个基本的草图开始,在某个地方显示一个硬编码的圆,然后打印出它和鼠标之间的距离吗?在此基础上再接再厉。你能让这个圆通常是红色的,但是当鼠标离它一定距离时变成绿色吗?现在你能让它在变成绿色时画一个新的圆吗?

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

匿名用户

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));
  }
}