如何检查两个圆是否在处理中相交?

时间:2018-12-31 21:26:03

标签: java processing

因此,我目前正在学习Java,并且为使我的代码正常工作而付出了很多努力。 我制作了一个“有趣”的代码,其中弹出了一些圆圈,它计算出屏幕上侧有几个圆圈。 (我知道,一些愚蠢的代码。) 我正在“处理”环境中对其进行编码,语言是Java。

这是我的主文件:

Circle[] circles = new Circle[50];

int index = 0;
boolean finished = false;

void setup() {
  size(900, 900);
  background(0);

  for(int i = 0; i < circles.length; i++) {
    circles[i] = new Circle();
  }

  if(finished = true) {
  }
}

void draw() {
  if(index < circles.length) {
    circles[index].show(circles);
    index++;
  } else {
    finished = true;
  }
}

void count(Circle[] arr) {
  int n = 0;
  for(Circle c : arr) {
    if(c.getY() > height / 2) {
      n++;
    }
  }
  println(n);
}

这是“问题”圈子类:

class Circle {
  private int x, y;
  private float r = random(10, 25);

  Circle() {
    this.x = Math.round(random(0 + r, width - r));
    this.y = Math.round(random(0 + r, height - r));
  }

  public int getX() {
    return this.x;
  }

  public int getY() {
    return this.y;
  }

  public void show(Circle[] arr) {
    if(isColliding(arr)) {
      this.x = Math.round(random(0 + r, width - r));
      this.y = Math.round(random(0 + r, height - r));
    } else {
      ellipse(this.x, this.y, r * 2, r * 2);
      stroke(255);
      fill(255);
    }
  }

  public boolean isColliding(Circle[] arr) {
    boolean result = false;
    if(arr == null) {
      result = false;
    } else {
      for(Circle c : arr) {
      float d = dist(c.getX(), c.getY(), this.x, this.y);
        if(d < r * 2) {
          result = true;
          println("Collision at: " + c.getX() + " " + c.getY());
          break;
        }
      }
    }
    return result;
  }
}

如您所见,我已经有一个isColliding方法,并且控制台中的输出似乎是正确的,但是在show()方法中不起作用,圆圈不会停止相交。 / p>

那么我该如何运作?当位置发生冲突时重新计算位置?

1 个答案:

答案 0 :(得分:0)

您确定碰撞方法有效吗?除非我丢失了某些内容,否则当您传递包含自身的数组时,它应该始终返回true。

此外,我将开始研究show()逻辑的布局方式。您正在检查是否存在重叠,如果发现新的随机位置,则分配一个新的随机位置。这个新位置很可能在一个已经绘制好的圆上。

将重新定位放置在循环中,以便它检查以确保不只是将自身放置在现有的圆上。

public void show(Circle[] arr) 
{
    /* 
      You could potentially get into a situation where you will NEVER find an empty spot. 
      Add an escape method for the loop.
    */
    int failLimit = 500;
    while(failLimit-- > 0 && isColliding(arr))
    {
        this.x = Math.round(random(0 + r, width - r));
        this.y = Math.round(random(0 + r, height - r));
    }
    ellipse(this.x, this.y, r * 2, r * 2);
    stroke(255);
    fill(255);
}

您可以简化此过程,并通过一次生成一个圆圈来进行检查,以确保其位置正确,从而使其效率更高。