我正在尝试将对象放置在屏幕上,并且在放置每个对象之后,我使用while循环来继续替换下一个对象,直到它不与任何先前的对象重叠,然后,如果尝试太多,我就会停止画画。
问题是在放置每个对象后,while循环中的条件数量需要增加,所以我想知道是否存在某种方法,类似于使用求和而不是添加?
编辑:
所有这些代码都包含在另一个for循环中,每个i
小于最大对象数。我尝试引入你可以看到的for循环,但这只会检查对象是否一次一个地与另一个对象相交,因此它可以与前一个对象重叠。
if(i > 0) {
for (int j = i - 1; j >= 0; j--) {
while ((atomXPosition[i] < atomXPosition[j] + atomWidth[j]
&& atomXPosition[i] + atomWidth[i] > atomXPosition[j]
&& atomYPosition[i] + atomWidth[i] > atomYPosition[j]
&& atomYPosition[i] < atomYPosition[j] + atomWidth[j])) {
atomXPosition[i] = (float) Math.random() * (screenWidth - atomWidth[i]);
}
}
}
答案 0 :(得分:1)
为什么没有Atom类?
import java.util.ArrayList;
import java.util.List;
public class Atom {
private static final int NUM_ATOMS = 20;
private static final int MAX_TRIES = 3;
public static void main(String[] args) {
List<Atom> atoms = new ArrayList<>();
for (int i = 0; i < NUM_ATOMS; i++) {
Atom atom = new Atom();
atoms.add(atom);
for (int tries = 0; tries < MAX_TRIES; tries++) {
if (atom.intersectsAny(atoms)) {
int randomX = //...
int randomY = //...
atom.moveTo(randomX, randomY);
}
}
}
}
private int x;
private int y;
private int width;
private int height;
public boolean intersectsAny(List<Atom> atoms) {
return atoms.stream().anyMatch(this::intersects);
}
private boolean intersects(Atom other) {
if (this == other) {
return false;
}
return //... check if this atom intersects other atom
}
public void moveTo(int x, int y) {
this.x = x;
this.y = y;
}
}
答案 1 :(得分:0)
您可以在while
循环中使用函数作为条件。此函数可能需要ArrayList
作为输入,您可以在ArrayList
循环的每次迭代中将对象添加到while
。