Rechtecke: Etwas besseres?
-
Hi,
ich suchte nach einer Funktion um 2 SDL Rects zu prüfen ob sie kollidieren und mir das Kollisionsrechteck wiedergibt.
Habe dabei sowas gefunden:
bool intersect (SDL_Rect *dest, const SDL_Rect *src1, const SDL_Rect *src2) { int px0,py0,px1,py1; int cx0,cy0,cx1,cy1; int rx0,ry0,rx1,ry1; // fill in default (NULL) result rectangle dest->x = 0; dest->y = 0; dest->w = 0; dest->h = 0; // get coordinates of the rectangles px0 = src1->x; py0 = src1->y; px1 = src1->x + src1->w - 1; py1 = src1->y + src1->h - 1; cx0 = src2->x; cy0 = src2->y; cx1 = src2->x + src2->w - 1; cy1 = src2->y + src2->h - 1; // check if the rectangles intersect if (/*(cx0 < px0) && */(cx1 < px0)) return false; if ((cx0 > px1) /*&& (cx1 > px1)*/) return false; if (/*(cy0 < py0) && */(cy1 < py0)) return false; if ((cy0 > py1) /*&& (cy1 > py1)*/) return false; // intersect x if (cx0 <= px0) rx0 = px0; else rx0 = cx0; if (cx1 >= px1) rx1 = px1; else rx1 = cx1; // intersect y if (cy0 <= py0) ry0 = py0; else ry0 = cy0; if (cy1 >= py1) ry1 = py1; else ry1 = cy1; // fill in result rect dest->x = rx0; dest->y = ry0; dest->w = (rx1-rx0)+1; dest->h = (ry1-ry0)+1; return true; };
Jetzt wollte ich einfach mal der neugierde halber fragen: Gibt es da auch was besseres oder muss man sich mit 8 abfragen zufrieden geben?
-
das sind 8 vergleiche und 12 additionen. da muss man nicht weiter optimieren, das wird sozusagen ruckzuck berechnet