Mamy 2 wymiarową płaszczyzne na której klikając lewy przycisk myszy tworze kwadrat 100x100 pikseli. Chciałbym żeby stawiając każdy kolejny kwadrat program sprawdzał czy postawiony obiekt nachodzi na inny który już tam się znajduje. Kod który sprawdza czy kwadrat A nachodzi na kwadrat B wygląda mniej więcej tak
class kwadrat
{
public:
int x, y, wysokosc, szerokosc;
};
bool czyObiektyNaSiebieNachodza(kwadrat A, kwadrat B)
{
if( A.x + A.szerokosc > B.x &&
A.x < B.x + B.szerokosc &&
A.y + A.wysokosc > B.y &&
A.y < B.y + B.wysokosc )
return true
else return false;
}
I załóżmy że mam tablice dynamiczną w której jest n takich kwadratów i chciałbym dorzucić kolejny. Żeby sprawdzić czy jeden nie nachodzi na drugi muszę stworzyć pętle która najpierw sprawdza czy nowy obiekt nie wchodzi w kolizje z kwadratem pierwszym, drugim, trzecim, czwartym... I tak n razy, czyli mniej wiecej tak:
kwadrat A;
kwadrat* B;
B = new kwadrat[ n ]; //n to ilosc kwadratow
for( int i = 0; i < n; ++i )
{
if( czyObiektyNaSiebieNachodza( A, B[ i ] )
{
cout << "Kwadrat A nachodzi na jeden z kwadratow B";
break;
}
}
Teraz mając już wszystko co potrzebuje chciałbym żeby za pomocą lewego przycisku myszy stawiać nowy kwadrat wielkości 100x100 pikseli. I tutaj pojawia się problem, nie mam pojęcia jak to elegancko zapisać, jedyne pomysły jakie mam to stworzyć zmienną typu bool przed pętlą, nadać jej wartość "false" i jeżeli podczas wykonywania pętli okaże się, że A nachodzi na B, to nadać tej zmiennej wartość "true" i po wykonaniu pętli warunek "if( czyNachodzi == false ){postawKwadrat( A )}".
Myślałem też o czymś typu
for( int i = 0; i < n; ++i )
{
if( czyObiektyNaSiebieNachodza( A, B[ i ] )
{
cout << "Kwadrat B nachodzi na jeden z kwadratow A";
break;
}
else if( i + 1 == n )
postawKwadrat( A );
}
Ale obie opcje wydają mi się takie nie do końca ładnie zapisane. Są jakieś lepsze, prostsze, bardziej przejrzyste sposoby zaprogramowania tego?