Labb 2 - Enkel grafik
När ni vill ha hjälp så använd Queue. När du är redo att redovisa: Skapa ett issue på Git med ämnet "Redovisning". En assistent kommer att rätta din labb och boka tid för redovisning med dig.
Mål för labben
Målet är att förstå strukturerad programmering (if, while och for) samt procedurell programmering (att skriva funktioner). Labben ger också viss förståelse för hur grafik fungerar, men den är hårt styrd. Pedagogiskt sett är planen att använda grafisk feedback för att förbättra dina programmeringskunskaper.
Krav för labben
- Du får återanvända exempelkoden nedan för att lösa labben och tanken är att du ska rita alla deluppgifter med hjälp av funktioner, if-satser, while-satser, for-loopar och img.put.
- När det står nedan att funktionerna ska ta koordinater som parametrar så ska dessa anges som tupler.
- Det är inte tillåtet att använda metoder på ett Canvasobjekt i lösningarna av deluppgifterna nedan. Mer specifikt är det inte tillåtet att använda inbyggda funktioner för att rita cirklar, trianglar eller kvadrater i grunduppgiften.
- Det är inte tillåtet att använda nyckelordet "to" som parameter till img.put.
- Om du använder eleganta repetitioner (for och while) så går varje funktion att implementera med mycket få anrop till put. För många put-anrop per funktion blir kodupprepning och ger underkänt.
- Dina utritningsfunktioner får inte vara destruktiva mot annat som redan är ritat på skärmen. Exempel: Det är inte tillåtet att förstöra allt annat på skärmen för att rita ut en triangel. Det är inte heller tillåtet att rita ut en rektangel med en triangel inuti om rektangeln förstör delar av bilden som inte ingår i triangeln.
- Förtydligande 2022-11-01: Exempelkoden överväger att rita ut varje pixel i fönstret. Det är bara OK om det som ska ritas ut täcker större delen av fönstret. Det är alldeles för ineffektivt om symbolen som ska ritas ut endast upptar en liten del av fönstret. Om en funktion kan användas för att rita ut små symboler (som bara ligger i en liten del av fönstret) så behöver de bildpunkter som du överväger att rita ut vara begränsade, till exempel med en rektangel som precis innesluter symbolen.
- Du ska inte behöva använda någon avancerad funktionalitet i tkinter för att lösa grunduppgiften. Se översta kravet.
- Det är tillåtet (men svårare på grunduppgiften, lättare för en del studenter på extrauppgiften) att använda ett annat grafikbibliotek, men det behöver fortfarande vara ett Pythonprogram som du lämnar in och redovisar.
- Förtydligande 2022-10-13T04:27 Koden behöver finnas på Git och den behöver ha hamnat där genom att göra add commit push från en terminal där du har en ssh-nyckel installerad, eller från en utvecklingsmiljö. Oavsett miljö så behöver du ha ordentliga commitmeddelanden. Web upload av kod ger inte godkänt.
Uppgift 1 – Rita en bild från ett färdigt program
Skriv in följande lilla program.
from tkinter import *
SIZE = 600
def sierpinski(img):
"""Adds a Sierpinski Fractal to img and returns None."""
for y in range(SIZE):
for x in range(SIZE):
if x&y == 0:
img.put("#ffffff", (x, y))
def main():
"""Create your image and call your functions inside this function."""
window = Tk()
canvas = Canvas(window, width=SIZE, height=SIZE, bg="#000000")
canvas.pack()
img = PhotoImage(width=SIZE, height=SIZE)
canvas.create_image((SIZE / 2, SIZE / 2), image=img, state="normal")
sierpinski(img)
mainloop()
if __name__ == '__main__':
main()
Kör programmet! Testa att ändra den globala konstanten SIZE för att ändra storleken på fönstret. Förtydligande 2022-11-10T16:43 Det går utmärkt att återanvända kod från ovanstående när ni löser uppgifterna nedan.
Uppgift 2 – rektangel
Definiera en funktion som ritar en fylld rektangel. Konturer räcker inte. Funktionen ska som parametrar ta bilden (img), koordinaterna för övre vänstra hörnet, kordinaterna för nedre högra hörnet och valfritt, men rekommenderat för nästa uppgift är en parameter för vilken färg som rektangeln ska ha.
Uppgift 3 – en ram
Skriv en funktion som ritar en svart rektangel innesluten i en vit rektangel. Det är tillåtet att lösa uppgiften med två anrop till den förra funktionen, särskilt om du valde dina parametrar klokt. Parametrisera var på skärmen som rektangeln ska ligga.
Uppgift 4 – triangel
Definiera en funktion som ritar en ifylld triangel. Funktionen ska ta koordinaterna för triangelns tre hörn som parametrar och fylla i allt mellan dessa hörn. Du får anta att katetrarna ligger parallellt med x- och y-axlarna. Förtydligande (2022-10-11): Om du inte gör extrauppgiften (som är en helt generell triangel) så behöver du kunna hantera följande placeringar av det 90-gradiga hörnet: ◢, ◣, ◤ och ◥. Om du gör extrauppgiften så kommer den automatiskt att klara alla 4 specialfallen.
Uppgift 5 – cirkel
Definiera en funktion som ritar en ifylld cirkel. Funktionen ska ta in radien och mittpunktens koordinater som parametrar.
Uppgift 6 – julgran
Använd en eller flera for-loopar för att sätta ihop flera trianglar av olika storlekar, samt en rektangel för stammen och dessutom julgranskulor.
Uppgift 7 - En bild
Skriv ett program som sätter ihop minst en av varje ovanstående till en fin bild, till exempel på ett hus med en sol ovanför. Vi betygsätter det tekniska och inte det estetiska.
Extrauppgift för betygshöjning
- En Mandelbrotfraktal Links to an external site.. För att göra beräkningarna effektiva så är det OK att approximera oändligheten med 200.
- Skriv en funktion som ritar en ifylld triangel utifrån 3 punkter som kan ligga var som helst i bilden. (Förtydligande 2022-10-11, lade till att triangeln ska vara ifylld).