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