因此,我目前正在学习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>
那么我该如何运作?当位置发生冲突时重新计算位置?
答案 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);
}
您可以简化此过程,并通过一次生成一个圆圈来进行检查,以确保其位置正确,从而使其效率更高。