Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • Wouter.Gravendeel/lab4
  • Henrik.Trondseth/lab-4-v-24
  • Njal.Nordal/lab4
  • Rein.Landmark/lab4
  • Erik.Vold/lab-4-v-24
  • Per.Broberg/lab4
  • Simon.Alvsaker/lab4
  • Fredrik.B.Hansen/lab4
  • Hannah.A.Solheim/lab4
  • Stian.Ha/lab4
  • Martin.Pedersen1/lab4
  • Jonas.Hasaas/lab4
  • Jakob.Berg/lab4
  • Emilie.Hamang/lab4
  • erlend.hontorp/lab4
  • jonas.sterud/lab4
  • Stefan.Asheim/lab4
  • Ingeborg.Navestad/lab4
  • antoine.hureau/lab4
  • ii/inf101/24v/students/lab4
  • Jonas.Justesen/lab4
  • stine.kristoffersen/lab4
  • Laura.Hollaseter/lab-4-grid
  • Alexander.Namdal/lab4
  • Martin.Andreassen/lab4
  • Tonning.Meling/lab4
  • herman.jakobsson/lab4
  • Anders.Tokje/lab4
  • Alfred.Thormodsater/lab4
  • Hakon.Molnes/lab4
  • Ferdinand.Gjessing-Haldorsen/lab-4-4
  • H.Hallerud/lab4
  • Daniel.Bjornstad/lab4
  • adil.obol/lab4
  • Diana.Carvajal/lab4
  • Magalie.Kalash/lab4
  • Amiley.Siidi/lab4
  • Tobias.Munch/lab4
  • ingeborg.lende/lab-4-v-24
  • Marcus.Osland-Rong/lab4
  • Markus.Halsvik/inf-101-lab-4
  • Espen.Svasand/lab-4-24
  • Goran.Kvitne/lab4
  • Isak.Graarud/lab4
44 results
Show changes
Commits on Source (16)
......@@ -5,8 +5,10 @@
I denne lab'en skal vi tegne et rutenett som vist over. Oppgaven består i hovedsak av tre deler:
1. Skriv en klasse `ColorGrid` som representerer et rutenett av farger.
2. Skriv en klasse `CellPositionToPixelConverter` som har en metode som regner ut piksel-koordinatene for en gitt rute.
2. Skriv en klasse `GridView` som kan tegne et rutenett av farger.
3. Skriv en klasse `GridView` som kan tegne et rutenett av farger.
---
### Guide:
1. [Anbefalte forberedelser](./guide/01-preparations.md)
2. [Bli kjent med utlevert kode](./guide/02-familiarize_with_code.md)
3. [Opprett rutenett av farger](./guide/03-create_color_grid.md)
......@@ -15,4 +17,4 @@ I denne lab'en skal vi tegne et rutenett som vist over. Oppgaven består i hoved
<br></br>-CellPositionToPixelConverter
<br></br>-drawGrid
<br></br>-drawCells
6. [Bonusoppgave](./guide/09-bonus.md)
\ No newline at end of file
6. [Bonusoppgave](./guide/06-bonus.md)
forrige &bullet; [oversikt](../README.md) &bullet; [neste](02-familiarize_with_code.md)
## Anbefalte forberedelser
* Laben antar at du har kjennskap til grunnleggende java, inkludert [grensesnitt](https://inf101.ii.uib.no/notat/grensesnitt/), [klasser og objekter](https://inf101.ii.uib.no/notat/objekter/).
* Du bør ha skummet igjennom kursnotatene om [arv](https://inf101.ii.uib.no/notat/arv), men vi kommer ikke til å gå i dypden på dette i denne lab'en.
* I den utleverte koden dukker det opp to *record*-klasser. Du trenger ikke sette deg inn i mutabilitet for denne lab'en, men kursnotatene om dette inneholder også et [avsnitt om record-klasser](https://inf101.ii.uib.no/notat/mutabilitet/#record) hvor det er verdt å skumme gjennom eksempelet som demonstrerer bruken.
* Kursnotatene om [grafikk](https://inf101.ii.uib.no/notat/grafikk) vil naturligvis være spesielt relevante, primært de tre første avsnittene om rammeverket, koordinatsystemet og grunnleggende figurer; men også hjelpemetoder, farger og adaptiv tegning blir adressert i lab'en.
\ No newline at end of file
* Laben antar at du har kjennskap til grunnleggende java, inkludert [grensesnitt](https://inf101v23.stromme.me/notat/grensesnitt/), [klasser og objekter](https://inf101v23.stromme.me/notat/objekter/).
* Du bør ha skummet igjennom kursnotatene om [arv](https://inf101v23.stromme.me/notat/arv/), men vi kommer ikke til å gå i dypden på dette i denne lab'en.
* I den utleverte koden dukker det opp to *record*-klasser. Du trenger ikke sette deg inn i mutabilitet for denne lab'en, men kursnotatene om dette inneholder også et [avsnitt om record-klasser](https://inf101v23.stromme.me/notat/mutabilitet/#record) hvor det er verdt å skumme gjennom eksempelet som demonstrerer bruken.
* Kursnotatene om [grafikk](https://inf101v23.stromme.me/notat/grafikk/) vil naturligvis være spesielt relevante, primært de tre første avsnittene om rammeverket, koordinatsystemet og grunnleggende figurer; men også hjelpemetoder, farger og adaptiv tegning blir adressert i lab'en.
[forrige](01-preparations.md) &bullet; [oversikt](../README.md) &bullet; [neste](03-create_color_grid.md)
## Bli kjent med utlevert kode
Undersøk filene i pakken `no.uib.inf101.colorgrid`, og besvar spørsmålene i `TextQuestions` ([link](./src/main/java/no/uib/inf101/colorgrid/TextQuestions.java)).
Undersøk filene i pakken `no.uib.inf101.colorgrid`, og besvar spørsmålene i `TextQuestions` ([link](../src/main/java/no/uib/inf101/colorgrid/TextQuestions.java)).
✅ Du er klar til gå videre når alle testene i `TestTextQuestions` ([link](./src/test/java/no/uib/inf101/colorgrid/TestTextQuestions.java)) passerer.
\ No newline at end of file
✅ Du er klar til gå videre når alle testene i `TestTextQuestions` ([link](../src/test/java/no/uib/inf101/colorgrid/TestTextQuestions.java)) passerer.
[forrige](02-familiarize_with_code.md) &bullet; [oversikt](../README.md) &bullet; [neste](04-drawing.md)
## Opprett rutenett av farger
I denne oppgaven skal du lage klassen `ColorGrid` ([link](./src/main/java/no/uib/inf101/colorgrid/ColorGrid.java)). Den er nå helt tom.
I denne oppgaven skal du lage klassen `ColorGrid` ([link](../src/main/java/no/uib/inf101/colorgrid/ColorGrid.java)). Den er nå helt tom.
<h2>I de følgende oppgavene vil du måtte tenke ut løsninger selv. Ikke alt vil stå 100% forklart.</h2>
* [ ] La klassen implementere grensesnittet `IColorGrid`
* [ ] La klassen ha en konstruktør med to parametre: en int som beskriver antall rader, og en int som beskriver antall kolonner. Standard-verdien til en posisjon i rutenettet (før `set`-metoden har blitt kalt på gitt posisjon) skal være `null`.
* [ ] Fyll ut metodene du trenger i overenstemmelse med javadoc-kommentarene til `IColorGrid`.
**TODO:**
* La klassen implementere grensesnittet `IColorGrid`
* La klassen ha en konstruktør med to parametre: en int som beskriver antall rader, og en int som beskriver antall kolonner. Standard-verdien til en posisjon i rutenettet (før `set`-metoden har blitt kalt på gitt posisjon) skal være `null`.
* Fyll ut metodene du trenger i overenstemmelse med javadoc-kommentarene til `IColorGrid`.
Du kan leke deg litt i `Main::main` for å sjekke for deg selv at klassen fungerer som du forventer. For eksempel:
......@@ -24,4 +29,4 @@ System.out.println(grid.get(new CellPosition(2, 1))); // forventer null
```
Husk å rydde opp etter deg i `Main::main` når du er ferdig!
✅ Du er klar til gå videre når alle testene i `TestColorGrid` ([link](./src/test/java/no/uib/inf101/colorgrid/TestColorGrid.java)) passerer.
\ No newline at end of file
✅ Du er klar til gå videre når alle testene i `TestColorGrid` ([link](../src/test/java/no/uib/inf101/colorgrid/TestColorGrid.java)) passerer.
[forrige](03-create_color_grid.md) &bullet; [oversikt](../README.md) &bullet; [neste](05-create_drawable_grid.md)
## Tegning
Ha kursnotatene om [grafikk](https://inf101.ii.uib.no/notat/grafikk) i bakhodet når du gjør denne oppgaven.
Ha kursnotatene om [grafikk](https://inf101v23.stromme.me/notat/grafikk/) i bakhodet når du gjør denne oppgaven.
I `GridView`:
* [ ] La klassen utvide `JPanel`
* [ ] La konstruktøren til `GridView` sette standard størrelse på lerretet til 400x300 piksler
* [ ] Overskriv metoden `public void paintComponent(Graphics g)`. Begynn med å kalle på super-metoden og opprett en Graphics2D -variabel fra g, slik som vist i kursnotatene om grafikk.
* [ ] Velg din favoritt-figur fra kursnotatene og tegn den i paintComponent (midlertidig, fjern den igjen når vi senere skal tegne rutenettet )
**TODO: I `GridView`:**
* La klassen utvide `JPanel`
* La konstruktøren til `GridView` sette standard størrelse på lerretet til 400x300 piksler
* Overskriv metoden `public void paintComponent(Graphics g)`. Begynn med å kalle på super-metoden og opprett en Graphics2D -variabel fra g, slik som vist i kursnotatene om grafikk.
* Velg din favoritt-figur fra kursnotatene og tegn den i paintComponent (midlertidig, fjern den igjen når vi senere skal tegne rutenettet )
I `Main`:
* [ ] Opprett et `GridView` -objekt
* [ ] Opprett et `JFrame` -objekt
* [ ] Kall `setContentPane` -metoden på JFrame-objektet med GridView-objektet som argument
* [ ] Kall `setTitle`, `setDefaultCloseOperation`, `pack` og `setVisible` på JFrame-objektet etter mønster fra kursnotatene om grafikk.
**TODO: I `Main`:**
* Opprett et `GridView` -objekt
* Opprett et `JFrame` -objekt
* Kall `setContentPane` -metoden på JFrame-objektet med GridView-objektet som argument
* Kall `setTitle`, `setDefaultCloseOperation`, `pack` og `setVisible` på JFrame-objektet etter mønster fra kursnotatene om grafikk.
✅ Du er klar til å gå videre hvis du ser tegningen din i et vindu når du kjører `Main`.
\ No newline at end of file
✅ Du er klar til å gå videre hvis du ser tegningen din i et vindu når du kjører `Main`.
[forrige](04-drawing.md) &bullet; [oversikt](../README.md) &bullet; [neste](06-bonus.md)
## Opprett rutenettet som skal tegnes
I `Main::main` skal vi nå opprette et rutenett, og gi det til `GridView`-konstruktøren som et argument ved opprettelse. Deretter skal vi endre GridView slik at den tegner dette rutenettet.
* [ ] I `Main::main`, opprett et ColorGrid-objekt med 3 rader og 4 kolonner. Sett fargene i hjørnene til å være
**TODO:**
* I `Main::main`, opprett et ColorGrid-objekt med 3 rader og 4 kolonner. Sett fargene i hjørnene til å være
* Rød i hjørnet oppe til venstre (posisjon (0, 0))
* Blå i hjørnet oppe til høyre (posisjon (0, 3))
* Gul i hjørnet nede til venstre (posisjon (2, 0))
* Grønn i hjørnet nede til høyre (posisjon (2, 3))
* [ ] I `GridView`, legg til en parameter av typen `IColorGrid` i konstruktøren, og legg også til en instansvariabel av samme type. Initialiser feltvariabelen med argumentet gitt til konstruktøren.
* I `GridView`, legg til en parameter av typen `IColorGrid` i konstruktøren, og legg også til en instansvariabel av samme type. Initialiser feltvariabelen med argumentet gitt til konstruktøren.
For å tegne rutenettet gjenstår det å endre på *paintComponent* -metoden. Vi skal benytte oss av tre hjelpemetoder for å tegne rutenettet. I *paintComponent* gjør vi et kall til
......@@ -33,22 +36,22 @@ Men -- dette er ikke tilstrekkelig informasjon for å gjøre utregningen; vi tre
Disse siste delene med informasjon vil ikke endre seg særlig fra kall til kall, men er en del av *konteksten* metoden kjører i. Slik kontekst er best beskrevet som feltvariabler.
I klassen `CellPositionToPixelConverter`:
**TODO: I klassen `CellPositionToPixelConverter`:**
* [ ] Opprett instansvariabler:
* Opprett instansvariabler:
* En `Rectangle2D` -variabel `box` som beskriver innenfor hvilket område rutenettet skal tegnes
* En `GridDimension` -variabel `gd` som beskriver størrelsen til rutenettet rutene vil være en del av
* En `double` kalt `margin` som beskriver hvor stor avstanden skal være mellom rutene
* [ ] Opprett en konstruktør i klassen med tre parametre: en `Rectangle2D` -variabel, en `GridDimension` -variabel og en `double`. Initaliser feltvariablene med argumentene som mottas i konstruktøren.
* [ ] Opprett metoden `getBoundsForCell` med en parameter av typen `CellPosition` (i figur under navgitt `cp`) og returtype `Rectangle2D`.
* Opprett en konstruktør i klassen med tre parametre: en `Rectangle2D` -variabel, en `GridDimension` -variabel og en `double`. Initaliser feltvariablene med argumentene som mottas i konstruktøren.
* Opprett metoden `getBoundsForCell` med en parameter av typen `CellPosition` (i figur under navgitt `cp`) og returtype `Rectangle2D`.
Returverdien er et `Rectangle2D` -objekt. For å opprette dette objektet, må du regne ut fire verdier: x, y, bredde og høyde for den gitte ruten. Så kan du returnere et nytt `Rectangle2D.Double` -objekt med disse verdiene.
Illustrasjonen under visualiserer parameterne og resultatvariablene. Variabler i svart tekst er gitt som input eller er tilgjengelig som feltvariabler, mens variablene i rød kursiv tekst er de du skal regne ut og returnere.
![Illustrasjon av variabler som opptrer i getBoundsForCell](./img/getBoundsForCell.png)
![Illustrasjon av variabler som opptrer i getBoundsForCell](../img/getBoundsForCell.png)
Hint:
**Hint:**
* Benytt `double` hvis du gjør regnestykker som involverer divisjon, da unngår du avrundingsfeil.
* Ikke bland horisontale og vertikale verdier. Horsiontale begreper: x, bredde, kolonne. Vertikale begreper: y, høyde, rad.
* Begynn med å regne ut *cellWidth* og *cellHeight*, og bruk verdiene du finner der for videre kalkulasjoner.
......@@ -73,14 +76,15 @@ Hint:
Denne metoden i `GridView` skal ha et `Graphics2D` -objekt som parameter, og ikke ha noen returverdi. Planen er å først tegne en stor grå firkant, og så tegne selve rutene «oppå».
- [ ] Opprett et Rectangle2D -objekt med en fast 30 pikslers avstand til kanten på vinduet (se avsnitt om fast avstand til kantene på lerretet i kursnotater om [grafikk](https://inf101.ii.uib.no/notat/grafikk/#fast-avstand-til-kantene-på-lerretet))
**TODO:**
- Opprett et Rectangle2D -objekt med en fast 30 pikslers avstand til kanten på vinduet (se avsnitt om fast avstand til kantene på lerretet i kursnotater om [grafikk](https://inf101v23.stromme.me/notat/grafikk/#fast-avstand-til-kantene-p%C3%A5-lerretet))
* Det kan være lurt å lagre tallet som en konstant med et beskrivende navn (altså opprett en static final feltvariabel `private static final double OUTERMARGIN = 30;` og så bruke `OUTERMARGIN` i stedet for 30 når du kommer tilbake her)
- [ ] Fyll rektangelet med gråfarge på lerretet.
- Fyll rektangelet med gråfarge på lerretet.
* Det kan være lurt å lagre fargen som en konstant med et beskrivende navn (altså opprett en static final feltvariabel `private static final Color MARGINCOLOR = Color.LIGHT_GRAY;` og så bruke `MARGINCOLOR` i stedet for Color.LIGHT_GRAY når du kommer tilbake her)
- [ ] Opprett et `CellPositionToPixelConverter` -objekt.
- Opprett et `CellPositionToPixelConverter` -objekt.
* Hvilket objekt med typen GridDimension skal du bruke som argument ved opprettelsen? Har du et slik objekt liggende et sted allerede?
* Marginen skal være et fast tall; i eksempelillustrasjonen er tallet 30 blitt brukt. Det kan være lurt å lagre tallet som en konstant med et beskrivende navn.
- [ ] Gjør et kall til en hjelpemetoden `drawCells` beskrevet under
- Gjør et kall til en hjelpemetoden `drawCells` beskrevet under
PS: Siden metoden benytter instansmetoder kan metoden *ikke* være static. Siden metoden ikke skal benyttes av noen utenfor `GridView` -klassen, bør metoden være *private*.
......
[forrige](05-create_drawable_grid.md) &bullet; [oversikt](../README.md) &bullet; neste
## Bonusoppgave
- [ ] La klassen `BeautifulPicture` i pakken `no.uib.inf101.bonus` utvide `JPanel` og tegn en vakker tegning med utgangspunkt i kursnotatene for grafikk. Benytt `Main` -klassen i samme pakke for å starte programmet.
**TODO: La klassen `BeautifulPicture` i pakken `no.uib.inf101.bonus` utvide `JPanel` og tegn en vakker tegning med utgangspunkt i kursnotatene for grafikk.** Benytt `Main` -klassen i samme pakke for å starte programmet.
Det blir en liten premie til det peneste bildet. Jury'en legger vekt på:
* at bildet er vakkert, og
* at bildet er *adaptivt*, det vil si: tilpasser seg størrelsen på vinduet på en pen måte, og
* at koden er vakker å lese.
Du er oppfordret til å bruke rikelig med hjelpemetoder og eventuelt også flere klasser som kan hjelpe til med tegningen dersom det er hensiktsmessig.
\ No newline at end of file
Du er oppfordret til å bruke rikelig med hjelpemetoder og eventuelt også flere klasser som kan hjelpe til med tegningen dersom det er hensiktsmessig.