eMatematikas Prisijunk Forumas Egzaminų užduotys ONLINE testai

C++ reikia palyginti ar stačiakampiai kertasi tarpusavyje.


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;
}


Mano idėja būtų iš kekvieno stačiakampio ištraukti min max X ir min max Y reikšmes ir paduoti į ta funkciją. Tada funkcijoje gautusi toks pseudo kodas:


    if (minX1 > maxX2 || minX2 > maxX1) {
      return false;
    }

    if (maxY1 < minY2 || maxY2 < minY1) {
      return false;
    }

    return true;


Į naktį veikiančio kodo nepagaminsiu, bet gal užves ant kelio. Manau algoritmas būtų teisingas. Nes tavo kode sunku kažka ižvelgti kai vienam if sakinyje tikrinama tiek reikšmiu. Nelabai gerai taip daryti.

pakeista prieš 5 m

bet čia būtu tik 2 taškai, man reikia 4 todėl taip ir gaunasi daug visko :(

ir gan kvailokas klausimas bet kaip minimumo šitoj situacijoj ieškoti?

ačiū tai labai padėjo. Dabar viskas veikia

Na, atsikeles supratau kad mano sprendimas netinka, jis tikrai nepadengs visu atveju. Reikia turbut tikrinti ar bent vienas taskas viename keturkampyje yra kitam keturkampyje. https://math.stackexchange.com/questions/190111/how-to-check-if-a-point-is-inside-a-rectangle

pakeista prieš 5 m

Nori sudalyvauti šioje temoje ir parašyti savo pranešimą? Prisijungti »