Calcoli area superficiale

0

Per il mio programma, ho implementato la collisione AABB che funziona bene. Quando la collisione AABB rileva una collisione tra 2 scatole, voglio trovare l'area della superficie in cui le 2 scatole si sovrappongono. C'è una semplice equazione da usare per scoprire quella superficie?

Ilproblemaprincipale:quindièstatodavverofacilepermeindicareiluoghidacalcolarepertrovareimieivaloriXeYsovrappostipertrovarelamiasuperficie.Propriocome"(| 6-3 |) * (| 6-4 |)". Il mio problema è che sto cercando di non avere problemi condizionali. Quindi mi chiedevo se esiste una formula in cui è possibile collegare tutti i punti di spigolo di entrambe le scatole e darà sempre l'area della superficie che si sovrappone, indipendentemente da come si sovrappongono. Questo mi farà risparmiare molto tempo ed essere più efficiente quando scrivo il mio codice.

NOTA:

  • Le scatole sono orientate dall'asse; Pertanto, i lati saranno sempre paralleli all'asse X e Y.
  • I punti di bordo del Box 1 e del Box 2 sono tutto ciò che è noto; Quindi, detto questo, non ci sono coordinate di dove le linee si intersecano.
posta AMDee 22.07.2015 - 17:08
fonte

2 risposte

3

Da molto tempo ho avuto lo stesso problema, mi è venuta in mente questa semplice soluzione:

  1. (Nel caso in cui non lo hai) Crea java.awt.Rectangle -Objects con altezza e larghezza corretti
  2. Sposta i rettangoli sulle coordinate che gli oggetti si trovano (usando Rectangle.setLocation (x, y)
  3. Chiama Rectangle1.intersection(Rectangle2) e lascia che la libreria esegua i calcoli

Ancora più semplice: I passaggi 1 e 2 possono essere eseguiti dal costruttore di java.awt.Rectangle

Rectangle r1 = new Rectangle(x1, y1, width1, height1);
Rectangle r2 = new Rectangle(x2, y2, width2, height2);
Rectangle intersectingRectangle = r1.intersection(r2);
    
risposta data 22.07.2015 - 17:15
fonte
1

Puoi usare questo pseudo-codice anche senza prima rilevare la collisione (o usarla per rilevare la collisione, se inter_area == 0 quindi non c'è collisione o tangente al massimo)

double intersection_area(rectangle box1,rectangle box2) {
    double inter_area=0.0
    double box1_top=box1.get_top() //10
    double box1_bottom=box1.get_bottom() //3
    double box2_top=box2.get_top() //6
    double box2_bottom=box2.get_bottom() //2
    double inter_height=min(box1_top,box2_top)-max(box1_bottom,box2_bottom) //6-3==3
    if (inter_height)>0 {
        double box1_right=box1.get_right() //6
        double box1_left=box1.get_left() //2
        double box2_right=box2.get_right() //8
        double box2_left=box2.get_left() //3
        double inter_width=min(box1_right,box2_right)-max(box1_left,box2_left)//6-3==3
        if (inter_width>0)
            inter_area = inter_height x inter_width //3x3==9
    }
    return inter_area
}
    
risposta data 22.07.2015 - 17:29
fonte

Leggi altre domande sui tag