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

    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
    }

    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); 
      }