Programarea Calculatoarelor - Laborator 2
În acest laborator vom exersa
- să scriem funcții care returnează valori calculate diferit în diverse condiții/situații, folosind expresia condițională
- să declarăm, definim și apelăm o funcție
- să scriem funcții simple care pot fi folosite din programe mai complexe, respectând cerințele specificate în enunț.
Mișcarea unui obiect în plan
Vom lucra cu un fragment de program,
fișierul miscare.c care animează în mod
grafic, pe ecran, mișcarea în plan unui obiect. Nu trebuie să studiem în
detaliu acest fișier, care conține o serie de apeluri de funcții
grafice. Remarcăm insă:
- fișierul conține la început declarațiile
funcțiilor new_vx și new_vy (doar antetul
funcției, cu tip, nume și parametri, urmat de
punct-virgulă, fără corpul care definește ce face
funcția)
- cele două funcții sunt apelate (folosite) ulterior
în program (identificați unde și în ce funcție)
Deși fișierul dat conține programul principal main
(vom discuta pe parcursul semestrului ce înseamnă argumentele,
spre deosebire de varianta cu void), acesta nu este un
program complet, deoarece nu conține și definițiile
funcțiilor new_vx și new_vy (cu tot cu corpul
lor), și deci nu e precizat ce și cum fac aceste funcții.
În această lucrare vom defini funcțiile respective, pentru a obține un
program complet care vizualizează pe ecran mișcarea unui obiect, conform
cerințelor precizate. Mai concret, vom modela mișcarea în plan a
unei bile, considerată punctiformă, ea fiind însă reprezentată
pe ecran ca un cerc.
Cele două funcții cerute definesc noua viteză după
o unitate de timp (corespunzând intervalului dintre două
reprezentări succesive în animație), în funcție de vechea viteză
și poziție, pentru fiecare din cele două componente (pe axele x și
y).
double new_vx(double vx, double x, double xmax);
unde vx reprezintă vechea viteză și x poziția curentă (ambele pentru axa x), iar xmax dimensiunea suprafeței de mișcare, un dreptunghi cu coordonatele limită (0,0) și (xmax, ymax). Cunoașterea limitelor e necesară pentru a modela comportamentul (posibil diferit) al bilei când ajunge la margine.
Totul e similar pentru viteza pe axa y.
Scrieți cele două funcții new_vx și new_vy într-un fișier separat, numit viteza.c. Aveți deja dat un fișier Makefile pentru utilitarul make, care specifică cum să fie compilat programul rezultant (numit bila) din cele două fișiere componente. Pentru a lansa compilarea, rulați, din catalogul unde ați salvat toate fișierele, comanda
make bila
care va apela compilatorul gcc cu opțiunile necesare, apoi rulați programul rezultat cu comanda
./bila
Puteți abandona rularea programului tastând Control-C în terminalul de unde ați lansat programul.
Pentru a lucra acasă, în Linux sau Windows, bibliotecile grafice sunt configurate ușor diferit:
- în fișierul dat, înlocuiți GLUT/glut.h cu GL/glut.h
- pentru Windows, instalați GLUT, de exemplu de aici, și puneți fișierul glut32.dll în directorul \Windows\system32
- pentru Linux, adăugați la opțiunile de compilare biblioteca: -lglut
- în ambele cazuri, puteți compila și fără Makefile: gcc opțiuni fișier1.c fișier2.c
Încercați să modelați una din următoarele situații:
- o bilă pe o masă de biliard, fără frecare: la atingerea unei margini,
ea ricoșează perfect (schimbând semnul vitezei pe direcția impactului).
- o bilă care alunecă în permanență pe marginea chenarului dreptunghiular
- o bilă care pornește din repaus de la un capăt, și trebuie să ajungă la celălalt capăt, fără să-l lovească (reducând viteza până la zero). Viteza și accelerația (în valoare absolută) sunt limitate la valori date.
- o bilă care se mișcă cu viteză constantă, descriind un cerc
- o bilă care la atingerea unei margini reintră în scenă
de pe marginea cealaltă (continuând permanent mișcarea în același sens).
Pentru aceasta, va trebui sa adaugați funcții care calculează
noua poziție, în funcție de poziția veche, viteză și limite.
- o combinație: pe o axă, bila ricoșează ca la biliard, pe cealaltă axă continuă mișcarea revenind în scenă de la marginea cealaltă.
- ... etc
Marius Minea
Last modified: Wed Mar 3 11:18:26 EET 2009