Come ottenere un'immagine o un rettangolo per rilevare la collisione con un'altra immagine

0

Qualcuno può spiegarmi come rilevare la collisione con un'altra immagine? Il tutorial che stavo guardando spiegava come rilevare se si verifica una collisione tra due rettangoli, ma vorrei invece usare due immagini. Si prega di consultare il codice qui sotto.

public void paintComponent(Graphics g){ 
//g.drawImage(yellowBall, xCoor, yCoor, this);
Rectangle r1 = new Rectangle((boardXSize/2), (boardYSize/2),50, 50);
Rectangle r2 = new Rectangle(200, (250),50, 50);
g.setColor(Color.red);
g.fillRect(r1.x, r1.y, r1.width, r1.height);
g.setColor(Color.blue);
g.fillRect(r2.x, r2.y, r2.width, r2.height);

if(r1.intersects(r2)){
        System.out.println("Collision Detected"); 
    }
repaint();

}

Come posso rilevare se r1 interseca YellowBall invece di r2? Ti preghiamo di mantenere le risposte a livello di principianti, ma ovviamente qualsiasi assistenza è molto apprezzata. Grazie !!

    
posta cjayem13 19.06.2014 - 01:28
fonte

3 risposte

1

Quando si utilizzano i rettangoli per rilevare le collisioni, si presume che il rettangolo contenga l'oggetto per il quale si sta verificando. Più il rettangolo racchiude l'oggetto, più preciso è il rilevamento della collisione. Qualsiasi parte dell'oggetto al di fuori del rettangolo non viene testata per la collisione.

Quindi la tua vera domanda potrebbe essere, "come faccio a disegnare un rettangolo attorno alla mia cerchia?"

Nel tuo caso, la palla presumibilmente inizia da (xCoor, yCoor) e si estende da lì in base alla dimensione dell'immagine.

    
risposta data 19.06.2014 - 01:57
fonte
1

Se sei bravo con la trigonometria, ecco il mio suggerimento sul rilevamento delle collisioni per una palla e un rettangolo:

scopri la distanza tra i 2 centri. da qui in poi chiamerò questa "connessione"

se la distanza è maggiore di ball.radius + rect.diagonal / 2 allora non si intersecano

se la distanza è minore rispetto a ball.radius o rect.height / 2 allora è garantito che si intersechino.

altrimenti usa la trigonometria per calcolare il segmento di connessione dal centro del rettangolo al suo perimetro. se ball.radius + segment < connessione quindi non si intersecano, se è = allora si toccano e se > poi si intersecano

Questo dovrebbe funzionare con qualsiasi forma in realtà, purché si trovi su un piano 2D. in 3D le cose diventeranno molto più complesse.

Inoltre, questo algoritmo ti darà sempre una soluzione quasi perfetta (cioè calcolo degli errori di arrotondamento, che sarebbe minima) ma non sarà molto veloce, quindi se stai scrivendo qualcosa come un gioco, è meglio solo creare un cerchio di collisione con diagonale / 2 come raggio attorno al rettangolo, sarà molto più veloce ma impreciso.

    
risposta data 19.06.2014 - 04:44
fonte
0

Per continuare l'approccio iniziato da tylerl, questo è tipicamente fatto in due fasi.

Il primo è creare un "riquadro di delimitazione" che circondi ogni oggetto e verificare se due caselle si intersecano. Testare se le caselle si intersecano è veloce.

Il secondo stadio viene impiegato quando sappiamo che le caselle si intersecano. Se non si intersecano, allora abbiamo finito. Per verificare se i due oggetti si intersecano è in genere più difficile, ma hai scelto uno dei casi "non troppo difficili".

Se avessi due cerchi, dovresti semplicemente calcolare la distanza tra i loro centri. Le tue abilità geometriche sono buone per questo?

Ma hai un caso leggermente più duro, un rettangolo e un cerchio. Usando la geometria, come possiamo determinare che la parte del rettangolo si sovrapponga?

    
risposta data 19.06.2014 - 03:05
fonte

Leggi altre domande sui tag