Forelæsning Uge 3 Torsdag Billedredigering (bl.a. brug af for-løkker) Gråtonebilleder (som er lidt simplere end farvebilleder) Arrays Kan "opbevare" et antal objekter (som ArrayList) Fast (på forhånd kendt) antal elementer Afleveringsopgave: Raflebæger 3 (DieCup 3)
Om programmering Programmering Anderledes Svær tankegang Faser Motivation Begejstring Tvivl? Frustration Eksistentiel krise Heureka! Fascination Indsigt Magt over teknologien Begejstring Tid 2
Billedredigering Lysere Mørkere Inverteret Uskarpt 3
Billedrepræsentation 0 0 x width Gråtoneværdi: Pixel (x,y) [0..255] hvor 0 ~ sort og 255 ~ hvid y height 4
Billedredigering Vi bruger to klasser Image repræsenterer et billede og har metoder som arbejder på billedet, bl.a. brighten, darken, invert og blur Pixel repræsenterer en pixel og har metoder til at aflæse og sætte pixlens gråtoneværdi Image * Pixel public class Pixel { én-til-mange relation // returnerer gråtonen for denne pixel public int getvalue() // opdaterer gråtonen for denne pixel public void setvalue(int value) 5
Class Image interface public class Image { // Returnerer billedets højde public int getheight() // Returnerer billedets bredde public int getwidth() // Returnerer pixlen på position (x,y) public Pixel getpixel(int x, int y) // Returnerer en liste med samtlige pixels i billedet public ArrayList<Pixel> getpixels() // Returnerer de op til ni naboer til (x,y) (inklusiv (x,y)) public ArrayList<Pixel> getneighbours(int x, int y) // Gentegner billedet public void pixelsupdated() 6
Skabelon for simpel billedbehandling image Vi bruger en for-each løkke til at gennemløbe samtlige pixels og opdatere dem en efter en Rækkefølgen er ligegyldig for os Pixel Arrayliste for ( Pixel p : image.getpixels() ) { int oldvalue = p.getvalue(); int newvalue =???; beregn newvalue ud p.setvalue(newvalue); fra oldvalue p 7
Brighten newvalue = oldvalue + 30 0 ~ sort, 255 ~hvid 8
Brighten, Javakode image for ( Pixel p : image.getpixels() ) { int oldvalue = p.getvalue(); int newvalue = oldvalue + 30 ; p.setvalue(newvalue); for ( Pixel p : image.getpixels() ) { p.setvalue(p.getvalue() + 30); p Kan I se et potentielt problem? 9
Invert newvalue = 255 - oldvalue 10
Invert, Javakode image for ( Pixel p : image.getpixels() ) { int oldvalue = p.getvalue(); int newvalue = 255 oldvalue ; p.setvalue(newvalue); for ( Pixel p : image.getpixels() ) { p.setvalue(255 - p.getvalue()); p 11
Eksempler på billedoperationer brighten darken invert blur mirror flip rotate resize Gør billedet lidt lysere Gør billedet lidt mørkere Inverterer hver gråtone Erstatter hver pixel med gennemsnittet af naboerne Spejler billedet om den vertikale midterakse Spejler billedet om den horisontale midterakse Roterer billedet 90 grader mod uret Skalerer billedet, så størrelsen ændres I den anden afleveringsopgave i uge 4 skal I implementere disse operationer 12
Arrays Arrays har et fast (på forhånd kendt) antal elementer Ligner Collections, men er bygget direkte ind i Java sproget Findes også i de fleste andre programmeringssprog 1. Erklæring (som feltvariabel) private int[] hourcounts; 2. Initialisering (ofte i konstruktør) hourcounts = new int[24]; Skal ikke importeres Kan også bruges på primitive typer Antal af elementer kan defineres via et udtryk Eksempler på brug count = hourtcounts[hour]; hourcounts[hour]++; Udtrykket i [ ] skal evaluere til et heltal i intervallet [0,23] Antal elementer i { bestemmer størrelsen Erklæring og initialisering med værdier kan slås sammen private int[] monthlength = {31,28,31,30,,30,31; 13
To metoder, der bruger et array // Analyserer antal events indtruffet i hver klokketime public void analyzehourlydata() { while (reader.hasmoreentries()) { LogEntry entry = reader.nextentry(); int hour = entry.gethour(); hourcounts[hour]++; // Udskriver antal events indtruffet i hver klokketime public void printhourlycounts() { System.out.println("Hr: Count"); for (int hour = 0; hour < hourcounts.length; hour++) { System.out.println(hour + ": " + hourcounts[hour]); 14
For løkker brugt på arrays Javas for-each løkke kan også bruges på arrays private String url; private String[] urls; for (String url : urls) { System.out.println(url); For-løkken giver adgang til at bruge indexet for (int hour = 0; hour < hourcounts.length; hour++) { System.out.println(hour + ": " + hourcounts[hour]); Det gør for-løkken ikke for (int value : hourcounts) { System.out.println(???? + ": " + value); 15
Forskelle på arrays og arraylister Arrays har et fast (på forhånd kendt) antal elementer Simplere syntax for erklæring private int[] hourcounts; i stedet for private ArrayList<Integer> hourcounts; Arrays kan bruges på primitive typer (uden brug af wrapper klasse) Simplere syntax for initialisering hourcounts = new int[24]; i stedet for hourcounts = new ArrayList<Integer>(); Simplere syntax for kald hourcounts[13]; i stedet for hourcounts.get(13); Meget nemmere at håndtere flerdimensionale strukturer minutecounts = new int[24][60]; secondcounts = new int[24][60][60]; Arrays er indbygget i Java sproget Giver mere effektiv implementering (hurtigere kode) og simplere syntax Kendt fra mange andre programmeringssprog Arrays er ikke en Collection type 16
Eksempler på brug af arrays Java API under ArrayList En arrayliste er en liste af elementer implementeret ved hjælp af et array I klassen Index har jeg Erklæret en feltvariabel Indsat fem Person objekter i arraylisten private ArrayList<Person> list; Klassen Person Feltvariabler: Klassen String private String name; private int age; En streng er en liste af tegn (char) Implementeret ved hjælp af et array 17
Lad os inspicere et objekt af klassen Index Objekt af klassen Index Kan I tænke på andre situationer, hvor det vil være naturligt at bruge arrays? 18
Billedrepræsentation via arrays 0 0 j width Pixel [ i ][ j ] [0..255] hvor 0 ~ sort og 255 ~ hvid i private Pixel[][] pixels; pixels = new Pixel[width][height]; height To dimensionalt array med width x height elementer 19
Skab et billede public class Image // Feltvariabler private int width, height; private String title; Reference til private Pixel[][] pixels; 2-dimensionalt... array (af Pixels) // Konstruktør public Image(int width, int height, String title){ this.width = width; j 0 this.height = height; 0 this.title = title; pixels = new Pixel[width][height]; // Lav alle pixels sorte i for(int i=0; i < height; i++) { for(int j=0; j < width; j++) { pixels[i][j] = new Pixel( 0 ); height Sort... 20 width
Metoder til at aflæse pixels // Returner pixlen i position(i,j) public Pixel getpixel(int i, int j){ return pixels[i][j]; // Returnerer arrayliste med alle pixels i billedet public ArrayList<Pixel> getpixels(){ ArrayList<Pixel> result = new ArrayList<Pixel>(); for(int i=0; i < height; i++){ for(int j=0; j < width; j++){ result.add(pixels[i][j]); return result; I en af afleveringsopgaver i uge 4 skal I arbejde med billedredigering I arbejder med arraylister Men "inde bagved" er billederne repræsenteret i 2-dimensionale arrays 21
Metode til at aflæse naboer // Returnerer en arrayliste med alle naboer public ArrayList<Pixel> getneighbours(int i,int j){ ArrayList<Pixel> result = new ArrayList<Pixel>(); for(int x = i-1; x <= i+1; x++){ for(int y = j-1; y <= j+1; y++){ addpixeltolist(x,y,result); return result; Vi skal tjekke om punktet (i,j) ligger indenfor billedet // Tilføj(i,j) til list, hvis (i,j) ligger indenfor billedet private void addpixel (int i, int j, ArrayList<Pixel> list){ if( 0 <= i && i < width && 0 <= j && j < height ){ list.add(pixels[i][j]); 22
Afleveringsopgave: Raflebæger 3 (DieCup 3) Vi skal endnu en gang arbejde videre med vores Raflebæger I skal lave noget mere aftestning Sammenligne slag fra to raflebægere, der har hhv. 3 og 4 terninger. Generalisere terningen, så den kan have et vilkårligt antal sider Skriv ny testmetode. 23
Opsummering Billedredigering Forberedelse til afleveringsopgave i Uge 4 Arrays Fast (på forhånd kendt) antal elementer Bygget direkte ind i Java Giver mere effektiv adgang til de enkelte elementer Simplere syntax (uden brug af de normale metode kald) Afleveringsopgave: Raflebæger 3 (DieCup 3) 24
Det var alt for nu.. spørgsmål 25