Pereiti prie turinio

C++ reikia palyginti ar stačiakampiai kertasi tarpusavyje


Rekomenduojami pranešimai

Labas vakaras, prašau gal galite man pagelbėti. Užduotis skamba taip:

Sukurti algoritmą, kuris nustatytų ar 2 keturkampiai kertasi tarpusavyje.

Iš klaviatūros įvedamos dviejų keturkampių viršūnių koordinates. Parašyti algoritmą, kuris nustato ar šie keturkampiai tarpusavyje kertasi. Pavyzdžiui, pirmojo keturkampio viršūnės: A (x1, y1), B (x2, y2), C (x3, y3), D (x4, y4) ir antrojo keturkampio viršūnės: E (x5, y5), F (x6, y6), G (x7, y7), H (x8, y8). Rezultatą išvesti į ekraną arba tekstinį dokumentą.

.

//---------------------

parašiau kodą man atrodo turėtu veikti bet kažkodėl neaptinka. Gal galit padėti ? pasakyti kas blogai arba pataisyti ir paaiškinti kurioje vietoje padariau klaidų? ačiū iš karto

#include<bits/stdc++.h>

struct kordinates
{
   int x, y;
};

// Bool funkcija grazins true jei staciakampiai kirsis
bool arkertasi(kordinates pirma1, kordinates antra1, kordinates trecia1, kordinates ketvirta1, kordinates pirma2, kordinates antra2, kordinates trecia2, kordinates ketvirta2)

{
   // tikrinu staciakampio virsunes
   if (pirma1.x < antra2.x || pirma2.x < antra1.x || trecia1.x < ketvirta2.x || trecia2.x < ketvirta1.x || pirma1.x < ketvirta2.x || antra1.x < ketvirta2.x || antra1.x < ketvirta2.x)
       return false;

   // tikrinu y
   if (pirma1.y > antra2.y || pirma2.y > antra1.y || trecia1.y > ketvirta2.y || trecia2.y > ketvirta1.y)
       return false;

   return true;

}
int main()
{
   // pirmo keturkampio kordinates
   kordinates pirma1 = {1, 1};
   kordinates antra1 = {1, 8};
   kordinates trecia1 = {5, 5};
    kordinates ketvirta1 = {5, 1};
   //--------------------------
   // antro keturkampio kordinates
   kordinates pirma2 = {4, 3};
   kordinates antra2 = {6, 6};
   kordinates trecia2 = {10, 6};
    kordinates ketvirta2 = {10, 2};
     //--------------------------
   if (arkertasi(pirma1, antra1, trecia1, ketvirta1, pirma2, antra2, trecia2, ketvirta2))

       printf("Sie keturkampiai tarpusavyje kertasi");
   else
       printf("Sie keturkampiai tarpusavyje nesikerta");
   return 0;
}


Nuoroda į pranešimą
Dalintis kituose puslapiuose

gal galit detaliau padėti ? laikas spaudžia :(

 

Šiaip jau pas tave labai durnai pavadinti kintamieji - logiškiau būtų vadinti pagal kvadratus (pimojo kvardato kampai v adinasi pirmas.x1, pirmas.y1, pirmas.x2, pirmas.y2 ir t.y., antrodojo kvardato antras.x1, antras.y1 t.t.). Kol programa maža tai aišku painiavos nebus, bet kai programos didėja, tai painiava atsiranda labia greitai. Todėl geriau jau mokytis taisikyklingų praktikų nuo pat pradžių.

 

Beje, ar pagalvojai kad stačiakampiui apsirašyti užtenka žinoti du priešingus jo kampus (t.y. dviejų priešingų kampų koordinates)? Nereikia žinoti 4 taškų. Ar čia pas tave sąlygoj duota, kad yra duodami 4 taškai?

 

O dabar prie tavo užduoties. Visų pirma: kas garantuoja kad pas tave duomenys tikslūs ir tvarkingi?

Pvz.,:

   // pirmo keturkampio kordinates
   kordinates pirma1 = {1, 1};
   kordinates antra1 = {1, 8};
   kordinates trecia1 = {5, 5};
    kordinates ketvirta1 = {5, 1};
   //--------------------------
   // antro keturkampio kordinates
   kordinates pirma2 = {4, 3};
   kordinates antra2 = {6, 6};
   kordinates trecia2 = {10, 6};
    kordinates ketvirta2 = {10, 2};

nesigauna stačiakampiai, gaunasi kažkokios trapecijos (pasipaikšyk ant languoto popieriaus jei netiki, o jei turi vaizduotę tai pamatysi vien iš koordinačių). Nes stačiakampui turi atitikti taškų koordinatės:

pirmas (x1, y1)

pirmas (x1, y2)

pirmas (x2, y1)

pirmas (x2, y2)

 

Nebent tie stačiakampiai pas tave gali būti pasukti kampu, tada jau įsiveda trigononometrinės formulės.

 

Antra, ar kas nors sąlygoje garantuoja, kad kampo koordintė x1 bus mažesnė už x2, ar čia reikia programiškai tikrinti? Nes tokiu atveju prisideda truputis darbo skaičiuoti kuri x koordinatė mažesnė. Tas pats ir su y koordinate.

 

Antra - ar tų stačiakampių kraštinės lygiagrečios X ire Y ašims, ar jie gali būti pasukti kampu?

 

O jei sąlyga teisinga ir ten tikrai turi būti stačiakampiai, tai dėl tikrinimo, tai kaip ir sakė - paprasta: tikrink ar kkuris nors kampas paklūna į kitą kvardatą - vadinasi kertasi. t.y. vieną stačiakampį imi kaip "pagrindinį", ir darai funkciją, kuri tikrina antrojo stačiakampio kampus ar x ir y koordinatės patenka į vidų:

 

if (pirmas.x1 > antras.x1) and (pirmas.x2 < antras.x1) // jei antras.x1 kordinatė patenka pirmas kraštinės ruožą

and pirmas.y1 > antras.y1) and (pirmas.y2 < antras.y2)

 

tada taškas patenka.

 

Tiesa, dar gali būti variantas kai stačiakampiai kertasi, nors nei vienas taškas nėra kito stačiakampio viduje (pvz., stačiakampiai

 

pirmas (2,2; 2,5; 5,5; 5,2) kertasi su stačiakampiu

antras (1,3; 1,4; 6,4; 6,3) nors nei vienas kampas nepatenka į kito stačiakampio vidų..

 

Vnž., reikia tikslintis sąlygą, nes uždavinys nėra toks paprastas kaip pasirodė iš pirmo žvilgsnio :)

 

Blemba, pas tave sąlygoje pasakyta "keturkampiai", o aš kažkodėl užsiciklinau ant stačiakampių :(

Redagavo simasj
Nuoroda į pranešimą
Dalintis kituose puslapiuose

Prisijunkite prie diskusijos

Jūs galite rašyti dabar, o registruotis vėliau. Jeigu turite paskyrą, prisijunkite dabar, kad rašytumėte iš savo paskyros.

Svečias
Parašykite atsakymą...

×   Įdėta kaip raiškusis tekstas.   Atkurti formatavimą

  Only 75 emoji are allowed.

×   Nuorodos turinys įdėtas automatiškai.   Rodyti kaip įprastą nuorodą

×   Jūsų anksčiau įrašytas turinys buvo atkurtas.   Išvalyti redaktorių

×   You cannot paste images directly. Upload or insert images from URL.

Įkraunama...
  • Dabar naršo   0 narių

    Nei vienas registruotas narys šiuo metu nežiūri šio puslapio.

×
×
  • Pasirinkite naujai kuriamo turinio tipą...