Cuprins

Tema 2: GPS tracker

Obiective

Informații

Descriere

Sistemul Global de Poziționare (sau GPS) este o rețea de aproximativ 30 de sateliți care orbitează în jurul Pământului, la o altitudine de 20.000km. Acesta a fost dezvoltat de guvernul Statelor Unite în scop militar, dar oricine folosește acum un dispozitiv GPS poate recepționa semnalele radio pe care sateliții le fac broadcast.

Oriunde te afli pe planetă, cel puțin 3 sateliți sunt 'vizibili' la un moment dat. Fiecare transmite informații despre poziția sa și timpul curent la anumite intervale. Aceste semnale sunt interceptate de dispozitivul GPS care calculează cât de departe e satelitul, în funcție de cât de mult îi ia mesajului să ajungă.

Odată ce acesta are informații despre cât de departe cei trei sateliți sunt, receiver-ul GPS poate indica locația folosind un proces numit trilaterație .

Trilaterația (măsurarea distanțelor, nu a unghiurilor)

Imaginează-ți că stai undeva pe Pământ cu 3 sateliți deasupra ta. Dacă știi cât de departe ești de satelitul A, atunci trebuie să te afli undeva în cercul roșu. Dacă consideri la fel pentru sateliții B și C, poți afla locația ta precisă calculând intersecția celor 3 cercuri. Asta este ceea ce receiver-ul GPS-ul tău face, deși acesta consideră sfere suprapuse.

Precizări

Vom considera ca fișier de intrare coordonate.in, în care pe prima linie vom avea un număr N care va reprezenta câte locații depistează sateliții noștri.

Pe următoarele linii vom avea pentru fiecare locație:


Coordonatele și raza se consideră date de fiecare satelit pentru fiecare dintre cele N locații.

Datorită distanței mult mai mari de la Pământ la sateliți, față de diferența de înălțime între sateliți, ei se pot considera în același plan (z1 = z2 = z3 = z). Între cele 3 sfere există așadar cel mult 2 puncte de intersecție, obținându-le prin găsirea triadelor (x,y,z) care să satisfacă ecuațiile sferei.

Pentru simplificarea modelului problemei, considerăm doar proiecțiile sferelor, și presupunem că acestea se vor intersecta doar într-un singur punct (cara va reprenzenta locația propriu-zisă)

Atenție: pentru a nu greși la calcule, se recomandă scrierea ecuațiilor celor 3 cercuri și aflarea coordonatelor unei locații prin calcularea punctului de intersecție; fiecare locație va fi considerată ca fiind un nod al grafului prin care ne construim drumurile de la o locație la alta.
Dacă cei 3 sateliţi sunt reprezentaţi cu cercurile C1(x1, y1, R1), C2(x2, y2, R2) şi C3(x3, y3, R3), atunci punctul de intersecţie al celor 3 cercuri, P(x, y) va respecta ecuaţiile:

(x-x1)2 + (y-y1)2 = R12

(x-x2)2 + (y-y2)2 = R22

(x-x3)2 + (y-y3)2 = R32

Se consideră prima coordonată calculată, locul din care plecăm.

Știind coordonatele tuturor locațiilor, vom considera costul de la o locație la cealaltă distanța dintre cele 2 puncte în plan.

Pentru punctele P1(x1, y1) şi P2(x2, y2) putem scrie ecuaţia distanţei: P1P2 = dist(P1,P2) = sqrt( (x1-x2)2 + (y1-y2)2 )

Vom primi un update printr-un fișier avarii.in drumurile avariate dintre 2 locații, pe care nu se poate merge.

Cerințe

Executabilul obținut în urma compilării va avea numele gps, iar regula de execuție va fi:

./gps coordonate.in avarii.in nume_destinatie coord_finale.out rezultat.out

unde numele destinației reprezintă locația unde vrem să ajungem pornind din nodul pe care am zis că-l vom considera nod de plecare.

În fișierul coord_finale.out se vor scrie numele și perechea (x,y) de coordonate calculate pentru fiecare locație, în ordinea citirii lor din fișierul de intrare coordonate.in

Având toate aceste date, vrem să calculăm costul celui mai scurt drum de la nodul de plecare, la cel destinație, pe care îl vom scrie în fișierul rezultat.out .

Exemplu (date fictive momentan, nu e test real!!)

coordonate.in avarii.in coord_finale.out rezultat.out
8 Loctie8 Locatie5 19 17 5
Locatie1 Loctie6 Locatie8 18 17
Satelit0 51 41 40 Loctie3 Locatie1 0 6
Satelit1 54 5 37 16 7
Satelit2 376 93 365 13 10
Locatie2 17 3
Satelit0 158 65 148 18 15
Satelit1 51 561 545
Satelit1 51 561 545
Locatie3
Satelit0 289 6 289
Satelit1 264 176 314
Satelit2 217 462 505
Locatie4
Satelit0 9 31 25
Satelit1 16 39 32
Satelit2 208 263 320
Locatie5
Satelit0 205 66 200
Satelit1 76 26 65
Satelit2 266 214 325
Locatie6
Satelit0 322 285 410
Satelit1 82 173 170
Satelit2 175 551 557
Locatie7
Satelit0 53 3 36
Satelit1 137 25 122
Satelit2 52 615 613
Locatie8
Satelit0 70 351 340
Satelit1 379 15 361
Satelit2 87 275 269

Reguli pentru trimitere

  1. Arhiva temei va avea numele GrupaSerie_Nume_Prenume_TemaNr.zip și va fi încărcată pe vmchecker, unde vă puteți loga folosind credențialele de pe acs.curs
  2. Ea va conține (direct în rădăcină):
    • fișierul main.c </br>
    • Makefile-ul (cu regulile make pentru executabilul gps și clean)
    • fișierul README în care va fi descrisă soluția problemei
  3. Dacă veți calcula coordonatele spațiale pentru toate locațiile (adică fișierul de ieșire coord_finale.out e integral corect pentru un test), se poate obține punctaj parțial de 50p
  4. Dacă soluția voastră nu compilează, dar dacă ideea este bună și trimiteți o încercare de implementare, puteți primi până la 20p
  5. Temele care vor fi copiate vor primi 0p

Referințe