Aggiunta di una soglia di sovrapposizione del rettangolo minimo

1

Ho una funzione che funziona perfettamente per rilevare se r1 si sovrappone o meno a r2:

boolean overlaps( Rectangle r1, Rectangle r2 ) {
    return r1.x < r2.x + r2.width && r1.x + r1.width > r2.x &&
        r1.y < r2.y + r2.height && r1.y + r1.height > r2.y;
}

Ma ora vorrei aggiungere una soglia minima in modo che restituisca true se r1 si sovrappone a r2 di almeno una determinata lunghezza.

Ecco cosa ho finora ma non ho avuto fortuna:

boolean overlaps( Rectangle r1, Rectangle r2, float threshold ) {
    return r1.x < r2.x + r2.width && r1.x + r1.width > r2.x + threshold &&
        r1.y < r2.y + r2.height && r1.y + r1.height > r2.y + threshold;
}
    
posta Jason Madux 16.06.2014 - 16:15
fonte

2 risposte

0

Trovo più facile leggere l'espressione se è possibile utilizzare i bordi del rettangolo con nome (Sinistra, Superiore, ecc. Potrebbero esserci anche lievi vantaggi in termini di prestazioni). Con questo in mente, questo codice dovrebbe funzionare:

boolean overlaps( Rectangle r1, Rectangle r2, float threshold  ) {
    return r1.Left < (r2.Right - threshold) && r1.Right > (r2.Left + threshold) &&
        r1.Bottom < (r2.Top - threshold) && r1.Top > (r2.Bottom + threshold);
}
    
risposta data 16.06.2014 - 18:27
fonte
0

Se r.xe r.y è il tuo angolo in basso a sinistra, quindi

boolean overlaps(Rectangle r1, Rectangle r2, float threshold) {
    boolean leftRight = false;
    if (r1.x < r2.x) {
        if(Math.abs(r1.x-r2.x)<r1.width+threshold) leftRight=true;
    } else {
        if(Math.abs(r1.x-r2.x)<r2.width+threshold) leftRight=true;
    }

    boolean upDown = false;
    if (r1.y < r2.y) {
        if(Math.abs(r1.y-r2.y)<r1.height+threshold) upDown=true;
    } else {
        if(Math.abs(r1.y-r2.y)<r2.height+threshold)  upDown=true;
    }

    return upDown&&leftRight;
}
    
risposta data 17.06.2014 - 13:23
fonte

Leggi altre domande sui tag