Ниже код сгенерировал и сохранил позицию x y в HashMap и проверил столкновение двух кругов;Холст Android. Как установить круги в случайном положении?
HashMap<Integer, Float> posX = new HashMap<>();
HashMap<Integer, Float> posY = new HashMap<>();
int numberOfCircle = 8;
for(int i=0; i < numberOfCircle; i ++){
// boolean flag = false;
while (true){
float x =random.nextInt(width - raduis/2) + raduis/2f;
float y =random.nextInt(height - raduis/2) + raduis/2f;
if(!posX.containsValue(x) && !posY.containsValue(y)){
if(i == 0){
posX.put(i, x);
posY.put(i, y);
break;
}
if(i > 0){
double distance = Math.sqrt(((posX.get(i - 1) - x) * (posX.get(i - 1) - x)) + ((posY.get(i - 1) - y) * (posY.get(i - 1) - y)));
if (distance > raduis+raduis) {
posX.put(i, x);
posY.put(i, y);
Log.d(TAG, i + " xPos=" + posX.get(i) + " yPos=" + posY.get(i) + " distance=" + distance);
break;
}
if(numberOfCircle == posX.size()) break;
}
}
}
}
Этот код работает только в том случае, если количество циклов = 2; Но когда число круга> 2 i имеет столкновение; Как проверить текущую сгенерированную позицию для каждого в HashMap?
Например: XPOS = {5, 10, 3} YPOS = {10, 33, 5}
генерируется положение х = 6, у = 10; вычислить расстояние между x = 6, y = 10 со всеми позициями в Map. Если расстояние < радиус + радиус создает новое положение при расстоянии радиуса + радиуса;
Update ========================>
Я хочу, как этот
выход: расстояние между текущей сгенерированной позицией (X, Y) и предыдущей позицией (X, Y). Я хочу проверить между текущими генерируемыми x, y со всеми добавленными позициями в HashMap.
D/DEBUG DATA ===>: 1 xPos=432.0 yPos=411.0 distance=390.6430595825299
D/DEBUG DATA ===>: 2 xPos=316.0 yPos=666.0 distance=280.1446055165082
D/DEBUG DATA ===>: 3 xPos=244.0 yPos=83.0 distance=587.4291446634223
D/DEBUG DATA ===>: 4 xPos=214.0 yPos=551.0 distance=468.96055271205915
D/DEBUG DATA ===>: 5 xPos=76.0 yPos=1011.0 distance=480.2540994098853
D/DEBUG DATA ===>: 6 xPos=289.0 yPos=868.0 distance=256.55019002136794
D/DEBUG DATA ===>: 7 xPos=494.0 yPos=988.0 distance=237.53947040439405
P.s Извините, что плохой английский.
Почему х/у 'float', когда они рассчитываются как' int' первоначально (случайным)? И вы усекаете это странным образом, в крайнем случае вы можете положить «x» в крошечный бит за пределы «width». ('width: 400, raduis: 1 -> nextInt (400) -> 399 -> 399 + 0.5f = 399.5f' выходит из диапазона [r/2, 399]) ... Я думаю, вы действительно хотели' x = nextInt (ширина - радиус) + радиус * 0,5f', который будет производить случайные числа в диапазоне [r/2, width-r/2]. Также вы можете объяснить, почему 'if (! PosX.containsValue (x) &&! PosY.containsValue (y)) {'? Таким образом, ни один круг не может иметь одинаковое положение x или y в любом круге? – Ped7g
Итак, вы пытались использовать мой ответ, или что такое статус этого Q? – Ped7g