Göm meny

Temarapport 2

Temarapport 2 handlar om att strukturera och dela upp ett problem i mindre delar. Nedan beskrivs tre problem, samt hur ni ska beskriva er lösning i er rapport. Rapporten skrivs i samma par som ni lämnat in Temauppgift 2 som.

Tre problem

Nedan följer tre olika problem som handlar om olika bilder som ska ritas ut med hjälp av ett program. För alla problem gäller att programmet ska kunna ta in olika parametrar som påverkar utseendet på den slutgiltiga bilden. Varje grupp (med romersk siffra) tilldelas ett av följande tre problem.

Uppdatering 2017-04-10: Koordinater till exempel för stegen uppdaterade. Uppdatering 2017-04-11: Koordinater till exempel för skyline uppdaterade.

Problem I - Stegen

Följande typ av figurer ska ritas med hjälp av kod:

Stege

Funktionen som anropas för att rita figuren är draw_ladder(grid, x, y, spacing, width, height). Här är förklaringar av argumenten:

  • grid är ett grid-objekt (se nedan)
  • x är x-koordinaten för det översta vänstra hörnet
  • y är y-koordinaten för det översta vänstra hörnet
  • spacing är mellanrummet mellan stegen
  • width är bredden på varje steg
  • height är antal steg som ska ritas ut

Ovanstående bild ska kunna ritas med följande kod:

from grid import Grid

grid = Grid(18)
draw_ladder(grid, 1, 1, 2, 9, 5)
draw_ladder(grid, 12, 3, 3, 5, 3)
grid.display()

Den minsta stegen placerad i översta vänstra hörnet är draw_ladder(grid, 0, 0, 1, 1, 1).

Problem II - Gallret

Följande typ av figurer ska ritas med hjälp av kod:

Galler

Funktionen som anropas för att rita figuren är draw_grating(grid, x, y, spacing, width, height). Här är förklaringar av argumenten:

  • grid är ett grid-objekt (se nedan)
  • x är x-koordinaten för det översta vänstra hörnet
  • y är y-koordinaten för det översta vänstra hörnet
  • spacing är mellanrummet mellan stängerna i gallret, samt längden på de “pinnar” som sticker ut från kanterna på gallret.
  • width är hur många stänger i bredd som gallret består av
  • height är hur många stänger i höjd som gallret består av

Ovanstående bild ska kunna ritas med följande kod:

from grid import Grid

grid = Grid(24)
draw_grating(grid, 6, 2, 2, 2, 4)
draw_grating(grid, 13, 1, 5, 4, 3)
grid.display()

Det minsta gallret placerad i översta vänstra hörnet är draw_grating(grid, 0, 0, 1, 1, 1).

Problem III - Skyline

Följande typ av figur ska ritas med hjälp av kod:

Skyline

Funktionen som anropas för att rita figuren är draw_skyline(grid, x, y, spacing, width, height). Här är förklaringar av argumenten:

  • grid är ett grid-objekt (se nedan)
  • x är x-koordinaten för det översta vänstra hörnet
  • y är y-koordinaten för det översta vänstra hörnet
  • spacing är mellanrummet innuti varje skyskrapa “pinnar” som sticker ut från kanterna på gallret.
  • width är hur många skyskrapor i bredd som skylinen ska bestå av
  • height är höjden på insidan av varje skyskrapa

Ovanstående bild ska kunna ritas med följande kod:

from grid import Grid

grid = Grid(24)
draw_skyline(grid, 0, 18, 2, 6, 5)
draw_skyline(grid, 8, 2, 3, 3, 8)
grid.display()

Det minsta skyline placerad i översta vänstra hörnet är draw_skyline(grid, 0, 0, 1, 1, 1).

Klassen grid.Grid

Antag att ni har en modul som ni laddar in från filen grid.py som innehåller klassen Grid. En Grid-instans används för att rita en figur. Koordinatsystemet i Grid börjar med x == 0 till vänster och y == 0 högst upp. Positiva värden på x och y är till höger respektive nedanför (0, 0).

En Grid-instans skapas med följande konstruktor:

  • Grid(size) där size är ett heltal som beskriver hur lång varje sida i det kvadratiska rutnätet ska vara.

Grid-instanser har följande metoder och attribut:

  • Metoden .line(x1, y1, x2, y2) ritar ut en linje mellan koordinaterna x1, y1 och x2, y2. Koordinater måste vara heltal.
  • Metoden .plot(x1, y1) fyller i en ruta med koordinaterna x1, y1. Koordinater måste vara heltal.
  • Attributet .color används för att välja färg som ritas med. Attributet sätts till en av följande strängar: "black", "red", "green", "yellow", "blue", "magenta", "cyan", "white".
  • Attributet .size är ett heltal som beskriver storleken på rutnätet.

Allmänna tips

Börja med att fundera den minsta figuren kan ritas ut.

Rapportdisposition

Nedan följer innehåll samt ordning på innehållet i rapporten som ska skrivas.

  1. Problemnamn och namn på gruppmedlemmar.
  2. Problembeskrivning: Börja med att beskriva problemet med egna ord.
  3. Problemuppdelning: Dela upp problemet i mindre delar och beskriv dessa delar. För varje delproblem, ta fram ett beskrivande namn på en funktion som löser det problemet, samt en kort beskrivning av problemet. Sammanställ dessa i en tabell med tabellrubrikerna funktionsnamn och beskrivning.
  4. Algoritm: Skriv kod som med hjälp av de funktioner ni namngivit och beskrivit i det föregående avsnittet löser ert figurritningsproblem. Infoga kommenterar så att koden blir läsbar.
  5. Alternativ problemuppdelning: Hur hade problemet kunnat struktureras annorlunda? Beskriv ett alternativ informellt. Denna beskrivning behöver inte använda sig av en tabell och ni kan också presentera ett alternativ som har en funktion som tar in andra argument än den givna.

Förtydligande 2017-04-10: Det viktiga med denna rapport är era problemuppdelningar. Mindre “räknefel” kommer inte att leda till att rapporten blir underkänd/behöver kompletteras. För de som vill testa kan man ladda ner grid.py, men det är inte nödvändigt att implementera fullt fungerande pythonkod för rapportens skull.

Om ni har tydliga beskrivningar i tabellen, räcker det med en funktionskommentar på en rad per funktion.

Exempel på algoritm för att rita en gran utan stam

Nedan ser ni ett exempel på hur en algoritm i rapporten skulle kunna se ut.

def draw_angle_r(grid, startx, starty, height, width1, width2):
    """Rita ut en högerspets att bygga gran med.
    
    \
     \
      \
       \
        \
      ---

    Ovanstående tecken representerar en högervinkel.


    grid   är den grid-instans som ska ritas på
    startx är x-koordinaten för det översta vänstra hörnet på den sneda linjen
    starty är y-koordinaten för det översta vänstra hörnet på den sneda linjen
    height är höjden på vinkeln
    width1 är bredden i x-led från spets till spets
    width2 är bredden på det undre strecket på vinkeln.
    """
    pass


def draw_angle_l(grid, startx, starty, height, width1, width2):
    """Rita ut en högerspets att bygga gran med.
    
        /
       /
      /
     /  
    /    
    ---

    Ovanstående tecken representerar en vänstervinkel.


    grid   är den grid-instans som ska ritas på
    startx är x-koordinaten för det översta vänstra hörnet på den sneda linjen
    starty är y-koordinaten för det översta vänstra hörnet på den sneda linjen
    height är höjden på vinkeln
    width1 är bredden i x-led från spets till spets
    width2 är bredden på det undre strecket på vinkeln.
    """
    pass


def draw_christmas_tree(grid, x, y, height, width1, width2):
    """Ritar ut en julgran.
    
    x      är ett heltal med toppens x-position
    y      är ett heltal med toppens y-position
    height är ett heltal med varje sektions höjd
    width1 är ett heltal med bredden i x-led på varje sned linje som bildar en
           vinkel
    width2 är ett heltal med bredden i x-led på det undre strecket som ligger
           under sned linje
    """
    # Översta delen är lite annorlunda eftersom vänster och höger vinkel
    # börjar på samma ställe.
    startx_r = x
    startx_l = x
    starty = y

    # loopen ritar först ut den första delen, sen flyttas vinklarnas
    # startpunkter utåt.
    for section in range(3):
        # rita ut vänstervinkel och högervinkel
        draw_angle_r(grid, startx_r, starty, height, width1, width2)
        draw_angle_l(grid, startx_l, starty, height, width1, width2)

        # flytta startpositionerna för nästa vänster- och högervinkel
        width_diff = width1 - width2      # Räkna ut hur mycket bredare nästa
                                          # steg ska vara.
        startx_r = startx_r + width_diff  # Lägg till på högersidan.
        startx_l = startx_l - width_diff  # Dra ifrån på vänstersidan.
        starty = starty + height          # Flytta ner y-koordinaten för nästa.

    # Till sist ritas strecket längst ner. Eftersom justeringen av starty
    # sker sist i loopen, har starty rätt värde för det sista strecket.
    grid.line(startx_l, starty, startx_r, starty)

Sidansvarig: Jody Foo
Senast uppdaterad: 2017-04-19