当前位置: 首页 > 知识库问答 >
问题:

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

山煜祺
2023-03-14
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;
  }
}

正如您所看到的,我已经有了一个iscollding方法,控制台中的输出似乎是正确的,但是它在show()方法中不起作用,圆圈不会停止相互交叉。

那么我怎样才能使它起作用,当它碰撞时,位置被重新计算呢?

共有1个答案

姬振濂
2023-03-14

你确定你的碰撞方法管用吗?除非我遗漏了什么,否则当您传入包含其自身的数组时,它应该总是返回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);
}
 类似资料:
  • 问题内容: 我收到了2个轮廓(和)。我怎么知道它们是否相交?我不需要坐标,我只需要一个布尔值或。 我尝试了不同的方式,并且已经尝试与 …但是得到的错误是数组没有方法“ Area()” 问题答案: 一旦有了的两个轮廓,就可以使用按位运算来检测相交。具体来说,我们可以使用。想法是为每个轮廓创建两个单独的图像,然后对它们使用逻辑运算。具有正值(或)的任何点都将是交点。因此,由于您只想获取是否存在相交的布

  • 我需要一个可以在junit 方法中调用的方法,该方法比较两个布尔值以检查它们是否相等,并返回一个布尔值。例如,类似这样的事情: 如果不相等,则返回false,如果相等,则返回true。我已经检查了布尔类,但是唯一接近的是< code>Boolean.compare(),它返回一个int值,我不能使用这个值。

  • 本文向大家介绍检查两个StringBuilder对象在C#中是否相等,包括了检查两个StringBuilder对象在C#中是否相等的使用技巧和注意事项,需要的朋友参考一下 要检查两个StringBuilder对象是否相等,代码如下- 示例 输出结果 这将产生以下输出- 示例 让我们看另一个例子- 输出结果 这将产生以下输出-

  • 问题内容: 我想检查两个数组是否相等。我的意思是:相同的大小,相同的索引,相同的值。我怎样才能做到这一点? 根据用户的建议,如果数组中的至少一个元素不同,我希望以下内容可以打印 enter ,但实际上没有。 问题答案: $arraysAreEqual = ($a == $b); // TRUE if $a and $b have the same key/value pairs. $arraysA

  • 问题内容: 我想知道如何检查两个功能是否相同。一个示例将评估为true。据我所知,Python将检查函数是否在内存中占据相同的位置,而不是它们是否具有相同的操作。我知道拥有该功能似乎不切实际。 另一个解决方案是我可以在函数上运行以查看其包含的内容或工作方式的某些方法。因此,其中一种将返回该方法的工作方式,可能是在字典中还是在某种形式中。 我希望得到一个答案,但我怀疑这是可能的。 问题答案: 如果您

  • 假设我有一组数组,包括和,我想检查它们是否相等。一般来说,我可以只使用(除了一些我现在忽略的愚蠢的情况)。 但是,这会计算的整个数组,这通常是不需要的。我的数组非常大,而且我有很多数组,两个数组相等的概率很小,所以很可能,在函数返回False之前,我只需要计算的一小部分,所以这对我来说不是一个最佳解决方案。 我尝试使用内置的函数,并结合: 然而,在两个数组相等的情况下,这似乎要慢得多,总的来说,它