Tips och facit till laborationer - Del 2
Här finns facit resp. lösningsförslag till laborationer som finns i de olika kapitlen på denna sajt under Kapitel --> Avsnitt 2.
Metoder
koordinatsystem
//Variabler
float dr = 0.01;
void setup(){
  size(600,600);
  background(190);
  ritaXYaxlar(200, 400);
  ritaXYaxlar(100, 500); //om man nu behöver två stycken ... 
}
void ritaXYaxlar(int x, int y){
  translate(x,y);   
  int l = 12;
  stroke(200,0,0);
  line(-600,0,600,0);
  line(0,-600,0,600);
  for(int i = -600; i < 600; i+=50){ line(i,-l,i,l);}
  for(int i = -600; i < 600; i+=50){ line(-l,i,l,i);}
  translate(-x,-y);
}
bilmetod
//Variabler
void setup() {
  size(800, 600);
  background(255);
   ritaBil(300, 100);
   ritaBil(500, 320);
  ritaBil(250, 500);
}
void ritaBil(int x, int y) {
translate(x,y);
  fill(255, 0, 0);
  noStroke();
  rect(-200, -30, 400, 60);
  rect(-120, -80, 206, 55);
  stroke(0);
  fill(255);
  rect(-105, -60, 179, 36);
  fill(0);
  ellipse(-140, 30, 72, 72);
  ellipse(150, 30, 72, 72);
  fill(180);
  ellipse(-140, 30, 45,45);
  ellipse(150, 30, 45,45);
  translate(-x,-y);
}
Max och CirkelArea
//Variabler
void setup() {
  size(500, 400);
  textSize(32);
  float a = 3.142459, b = 13.37; 
  float maximum = Max(a, b); //metodanrop
  text("Störst: " + maximum, 10, 50);
  float area = CirkelArea(200,200,150);
  text("area: " + area, 210,340);
}
// programmet hoppar hit när Max(a,b) anropas 
float Max(float x, float y) {
  float svar = 0;
  if ( x > y) {
    svar = x;
  } else { 
    svar = y;
  }
  return svar;
}
float CirkelArea(int x, int y, int radie){
  ellipse(x,y,radie,radie);
  return radie * radie * PI;
}
Summera fält
import java.util.Random;
  //Variabler
    int[] tal = new int[20];    
 // Huvudprogram
  void setup(){
    size(300,100);
    fyllFaltetMedSlumptal();
    int sum = summeraFelt(tal);
    textSize(32);
    text("summan är " + sum, 10,70);
  }
 //======= egna metoder ====================================
  void fyllFaltetMedSlumptal(){
    Random rnd = new Random();
    int i = 0;
    while( i < tal.length ){
    int slmp = rnd.nextInt(400)+50; // generera slumptal 50 .... 450 och spara i slmp
    tal[i] = slmp;            // och spara i slmp
    i++;
    }
  } // end fyllFaltetMedSlumptal
 int summeraFelt(int[] f){
   int sum = 0;
   for(int i = 0; i < f.length; i++){
     sum += f[i];
   }
   return sum; 
 }
GUI
Uppgift: Lägg till en knapp "Rita Kvadrat" med motsvarande metod.
Lösning: I grunden en kopia av koden med vissa ändringar. Jämför med Ett fungerade exempel
    //Variabler
    import g4p_controls.*; // importera biblioteket
    GButton knapp, knapp2; //knapp 2 kommer till
    void setup(){
      size(360,200);
      knapp = new GButton(this, 50, 20, 80, 40);
      knapp.setText("Rita cirkel");
      knapp.addEventHandler(this, "knapp_click");
      knapp2 = new GButton(this, 150, 20, 80, 40);  // ändring bara i x-led
      knapp2.setText("Rita kvadrat");               // ändrat text på knappen
      knapp2.addEventHandler(this, "andraHendelse");    // koppling Händelse med kodstycke
    }
    public void knapp_click(GButton source, GEvent event) { 
      ellipse(100,100,50,50);
    } 
    public void andraHendelse(GButton source, GEvent event) {  // kopplad till andra knappen ( knapp2)
      rect(100,100,50,50);
    } 
    // låt vara kvar, behövs för funktion
    // även om tom.
    void draw(){
    }
Uppgift: Se till att det ritas nya cirklar resp. rectanglar med varje knapptryck dvs att positionen varieras.
    //Variabler
    import g4p_controls.*; // importera biblioteket
    GButton knapp, knapp2; //knapp 2 kommer till
    int cirkX = 500, rectX = 100;
    void setup(){
      size(360,200);
      knapp = new GButton(this, 50, 20, 80, 40);
      knapp.setText("Rita cirkel");
      knapp.addEventHandler(this, "knapp_click");
      knapp2 = new GButton(this, 150, 20, 80, 40);  // ändring bara i x-led
      knapp2.setText("Rita kvadrat");               // ändrat text på knappen
      knapp2.addEventHandler(this, "andraHendelse");    // koppling Händelse med kodstycke
    }
    public void knapp_click(GButton source, GEvent event) { 
      ellipse(cirkX,100,50,50);
      cirkX -= 10; 
    } 
    public void andraHendelse(GButton source, GEvent event) {  // kopplad till andra knappen ( knapp2)
      rect(rectX,200,50,50);
      rectX += 20;
    } 
    // låt vara kvar, behövs för funktion
    // även om tom.
    void draw(){
    }
Samlingar & Listor
Plussa ihop
Plussa ihop alla element i listan. Vi ser även till att -1 försvinner. Det var ju bara ett värde för att avbruta inmatningen.
import java.util.LinkedList; // behövs för användning
    void setup() {
      LinkedList<Integer> minLista = new LinkedList<Integer>(); //Deklarera en lista för heltalsvärden;
      int tal = 0;
      int summa = 0; // för att summera alla a tal.
      while ( tal  != -1) {  // håller på tills val lika med -1
        tal = QuestionInt("Ange ditt heltal. Avsluta med -1"); // fråga
        minLista.add(tal);  // lägg till i slutet av listan
      }
      minLista.removeLast();  // den ser till att sista element i lista raderas.
      println("Du matade in " + minLista.size() + " tal" ); 
      for(int i = 0; i < minLista.size() ; i++ ) {
        int talet = minLista.get(i) ;
        println( talet ); 
        summa = summa + talet; // lägga till varje tal i summan. 
        }
      println("Summan av alla tal är " + summa);
      //ELLER SOM ALTERNATIV: 
      summa = 0; 
      for(int talet : minLista) {
        println(talet); 
        summa += talet;
      }
      println("Summan av alla tal är " + summa);
    }
Rita staplar
import java.util.LinkedList; // behövs för användning
    void setup() {
    setup(500,500); // annars blir fönstret för lite för att rita staplarna. 
      LinkedList<Integer> minLista = new LinkedList<Integer>(); //Deklarera en lista för heltalsvärden;
      int tal = 0;
      while ( tal  != -1) {  // håller på tills val lika med -1
        tal = QuestionInt("Ange ditt heltal. Avsluta med -1"); // fråga
        minLista.add(tal);  // lägg till i slutet av listan
      }
      minLista.removeLast();  // den ser till att sista element i lista raderas.
      int x = 10; // startvärde för staplarnas läge i x-led. 
      for(int i = 0; i < minLista.size() ; i++ ) {
        int talet = minLista.get(i) ;  //läsa från listplats i
        rect(x, 10, 30, talet); //  talet används för rektangelns längd. Hängande staplar 
        // rect( x, 490, 30,  -talet);  // negativa värden vända staplar uppåt. 
        x += 40;  // nästa rect ritas 40px till höger
        }
    }
Namnlista
Bygg om utgångsexemplet så att man kan mata in namn i stället för heltal. Inmatningen ska avslutas när man mata in "SLUT". För att jämföra två strängar gör man så här: while( ! namn.equals("SLUT") ) {  ..... .
Rader som ändras markeras med <===
    import java.util.LinkedList; // behövs för användning
    void setup() {
      LinkedList<String> minLista = new LinkedList<String>(); //Deklarera en lista för strängar;  <===
      //int tal = 0;
      String namn = "";  // <===
      while( ! namn.equals("SLUT") ) {  // håller på sålänge namn olika "SLUT"  // <===
        namn = QuestionString("Ange ett namn. Avsluta med 'SLUT'"); // fråga  // <===
        minLista.add(namn);  // lägg till i slutet av listan
      }
      minLista.removeLast(); // "SLUT" ska försvinna      // <===
      println("Du matade in " + minLista.size() + " namn" );   // <===
      for(int i = 0; i < minLista.size() ; i++ ) {   // <===
        namn = minLista.get(i) ;        // <===
        println( namn );  // <===
        }
      //ELLER
      for(String n : minLista) {  //  <===
        println( n );       // <===
      }
    }
Cirklar i listan
- Kopiera följande kod. Sedan ska programmet utökas så att alla positioner sparas i en LinkedList och används för att visa alla. Med varje musclick ska det kommer till en cirkel. Det kommer behövas två LinkedList
, en för x-koordinaten och en för y-koordinaten. i mousePressed-blocket ska det läggas till koordinater i listorna, i draw ska alla cirklar ritas i en loop.  
    import java.util.LinkedList;
    //Variabler
    LinkedList<Integer> xPos = new LinkedList<Integer>();
    LinkedList<Integer> yPos = new LinkedList<Integer>();
    void setup() {
      size(500, 500);
      fill(#FF0000);
      textSize(24);
    }
    void draw() {
      background(255);
      for(int i = 0; i < xPos.size() ; i++ ) {  // kunde även vara yPos.size().  vi antar att båda listor växer i samma takt.
        ellipse(xPos.get(i), yPos.get(i), 35, 35 );
      }
    }
    void mousePressed() {
      posX = (mouseX+20) / 40*40;
      posY = (mouseY+20) / 40*40;
      xPos.add(xPos);    // lägg till i listan 
      yPos.add(yPos);   // lägg till i listan
    }
- Endast de 10 senaste
 
    import java.util.LinkedList;
    //Variabler
    LinkedList<Integer> xPos = new LinkedList<Integer>();
    LinkedList<Integer> yPos = new LinkedList<Integer>();
    void setup() {
      size(500, 500);
      fill(#FF0000);
      textSize(24);
    }
    void draw() {
      background(255);
      for(int i = 0; i < xPos.size() ; i++ ) {  // kunde även vara yPos.size().  vi antar att båda listor växer i samma takt.
        ellipse(xPos.get(i), yPos.get(i), 35, 35 );
      }
    }
    void mousePressed() {
     int posX = (mouseX+20) / 40*40;
     int posY = (mouseY+20) / 40*40;
      xPos.add(posX);    // lägg till i listan 
      yPos.add(posY);   // lägg till i listan
    }
flytta till höger.
Varje omgång måste x-koordinaten höjas med ett visst värde.
Sätt den här loopen i draw-blocket:
for(int i = 0; i < xPos.size() ; i++ ) {
    int x = xPos.get(i);  // hämta
    x++;                    // höja med 1 . Om det ska bli långsammare byt till Float och höja med typ 0.4
    xPos.set(i, x);         // sätta tillbaka i listan.
}
// eller i samband med ritandet: 
for(int i = 0; i < xPos.size() ; i++ ) {  // kunde även vara yPos.size().  vi antar att båda listor växer i samma takt.
        int x = xPos.get(i);
        ellipse( x , yPos.get(i), 35, 35 );
        x++;
        xPos.set(i, x); 
      }
Numrering
Vi lägg till numret när vi rita alla cirklar. I for-satsen finns redan en variabel som levererar: i.
for(int i = 0; i < xPos.size() ; i++ ) {  
        int x = xPos.get(i);
        fill(255,0,0);                      // röda cirklar
        ellipse( x , yPos.get(i), 35, 35 );
        fill(0);            // med svart text. 
        text( (i + 1) ,   x , yPos.get(i)  // +1 för att det ska börja med 1, inte 0.
        x++;
        xPos.set(i, x); 
      }