Laboration 3: Grafisk display
- Inlämningsdatum 26 feb 2023 av 23.59
- Poäng 1
- Lämnar in en filuppladdning
- Filtyper zip
Laboration 3 består av tre uppgifter varav två behandlas utförligt utförligt i läroboken där de beskrivs i form av deluppgifter som successivt måste klaras av innan själva laborationsuppgifterna kan lösas.
För att kunna genomföra laborationen måste du ha arbetat igenom avsnitt 3.4 "Drivrutiner för grafisk display" i läroboken.
Laborationsuppgifterna baseras på följande exempel och uppgifter:
- Exempel 3.3 t.o.m 3.6, uppgifter 3.10 t.o.m 3.17.
Ni som gör laborationen på distans lämnar in laborationsuppgifterna 3.1, 3.2 och 3.3 nedan. Följ inlämningsformatet som specificeras på sidan Laborationsinformation (läs först!) under avsnittet "Inlämningsformat"
Laborationsuppgift 3.1: Enkla geometrier (uppgift 3.14 i läroboken)
Uppgiften är att konstruera en funktion som ritar en polygon till grafikdisplayen.
- Kontrollera programmets funktion med CodeLite och SimServer (hemma) eller MD407/USBDM (vid laborationsplatsen.)
OBS! När de fysiska displayerna används behövs extern strömförsörjning, en strömadapter kopplas in och MD407-kortet ställs in på "EXT".
Följande video visar hur programmet bör fungera i simulatorn:
Laborationsuppgift 3.2: Singel-Pong (uppgift 3.16 i läroboken)
I denna uppgift skapar vi en single player-variant av klassikern Pong.
- Kontrollera programmets funktion med CodeLite och SimServer (hemma) eller MD407/USBDM (vid laborationsplatsen.)
Laborationsuppgift 3.3: Spindeljakt (uppgift 3.17 i läroboken)
Uppgiften är att skapa en liten spelapplikation (1 användare) där en ”spindel” kan manövreras med hjälp av en keypad för att fånga in en liten boll som rör sig autonomt över skärmen. Som förberedelse för denna uppgift ska du även ha gjort uppgift 5.15 i läroboken.
Metoder för att kontrollera överlapp mellan två objekt
Det intuitivt första försöket kan vara att jämföra de pixlar de respektive objekten ockuperar:
int pixel_overlap(POBJECT o1, POBJECT o2) {
int offset1x = o1->posx;
int offset1y = o1->posy;
int offset2x = o2->posx;
int offset2y = o2->posy;
for (int i = 0; i < o1->geo->numpoints; i++) {
for (int j = 0; j < o2-> geo->numpoints; j++)
if ((offset1x + o1->geo->px[i].x == offset2x + o2->geo->px[j].x) &&
(offset1y + o1->geo->px[i].y == offset2y + o2->geo->px[j].y)) return 1;
}
return 0;
}
Metoden är exakt i den mening att bara ett geometriöverlapp kommer att detekteras. Om objekten överlappar krävs i värsta fall i*j iterationer där i är antalet pixlar i det första objektet och j är antalet pixlar i det andra objektet. För objekt som inte överlappar krävs i*j iterationer för att konstatera detta. Det kan bli mycket exekveringstid, speciellt som kontrollen måste utföras en gång för varje förflyttning av något objekt.
Som approximation kan man i stället jämföra objektens största utsträckningar i form av de största rektanglar som kan innesluta respektive objekts pixlar. Betrakta två objekt o1 och o2 med omslutande geometrier (ges i datastrukturen):
Av figuren framgår att vi med en approximerande funktion (med enkel komplexitet) snabbt kan undersöka om dessa båda rektanglar överlappar varandra genom att jämföra horisontella och vertikala gränsytor. Detta ger en betydligt snabbare funktion än den föregående och kan lämpligen användas här. Man kan förfina genom att först använda denna approximerande funktion och därefter (om rektanglarna överlappar varandra) använda den exakta jämförelsen.
- Implementera en funktion int objects_contact( POBJECT o1, POBJECT o2) genom att först göra en jämförelse mellan objektens omslutande rektanglar och därefter, om så krävs, en exakt jämförelse med pixel_overlap()
- Använd testprogrammet från lärobokens uppgift 5.17.
- Kontrollera programmets funktion med CodeLite och SimServer (hemma) eller MD407/USBDM (vid laborationsplatsen.)
Följande video visar hur programmet bör fungera i simulatorn: