Unter Code generiert und speichern Position x y HashMap und überprüfen Sie die Kollision zwei Kreise;Android-Leinwand. Wie setze ich Kreise auf zufällige Position?
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;
}
}
}
}
Dieser Code funktioniert nur, wenn Kreisanzahl = 2; Aber wenn ein Kreis> 2 zählt, habe ich eine Kollision; Wie kann ich die aktuelle Position in HashMap überprüfen?
Zum Beispiel: xPos = {5, 10, 3} yPos = {10, 33, 5}
erzeugt Position x = 6, y = 10; Berechnen Sie den Abstand zwischen x = 6, y = 10 mit allen Positionen in Map. Wenn der Abstand < Radius + Radius eine neue Position erzeugt, während die Entfernung> Radius + Radius ist;
aktualisieren ========================>
Ich möchte ähnliche
Ausgabe: Abstand zwischen aktuell erzeugter Position (X, Y) und vorheriger Position (X, Y). Ich möchte prüfen, ob die generierten x, y mit allen hinzugefügten Positionen in HashMap generiert wurden.
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. Sorry, so schlecht Englisch.
Warum sind x/y 'float', wenn sie als' int' berechnet werden zunächst (durch gelegentliches)? Und Sie schneiden das auf seltsame Weise ab, Sie können im Extremfall mit 'x' ein kleines bisschen hinter" width "enden. ('width: 400, raduis: 1 -> nextInt (400) -> 399 -> 399 + 0.5f = 399.5f' ist außerhalb von [r/2, 399] range) ... Ich denke du wolltest' x = nextInt (Breite - Radius) + Radius * 0.5f', die im Bereich [r/2, Breite-r/2] Zufallszahlen erzeugt. Kannst du auch erklären warum 'if (! PosX.containsValue (x) &&! PosY.containsValue (y)) {'? Also kann kein Kreis eine identische x- oder y-Position zu irgendeinem anderen Kreis haben? – Ped7g
Also hast du versucht, meine Antwort zu verwenden, oder was ist der Status dieses Q? – Ped7g