Control
Contents
Control¶
if … else if … else …¶
float r, g, b, a;
void setup() {
  size(800, 500);
}
void draw() {
  // Mouse in the left half:
  if (mouseX < width/2) {
    r = map(mouseX, 0, width/2, 0, 255);
  }
  // Mouse in the right half:
  else {
    g = map(mouseX, width/2, width, 0, 255);
  }
  // Mouse in the top half:
  if (mouseY < height/2) {
    b = map(mouseY, 0, height/2, 0, 255);
  }
  // Mouse in the bottom half:
  else {
    a = map(mouseY, height/2, height, 0, 255);
  }
  fill(r, g, b, a);
  rect(0, 0, width, height);
}
Relational operators¶
Relational operators compare two values and return a boolean value according to the operator.
Boolean is a simple data type which can have one of the two values true or false.
References:
These can be combined with so called logical operators:
Loops¶
for-loop¶

void setup() {
  size(800, 400);
  background(132, 159, 211);
  stroke(211, 204, 143);
  strokeWeight(3);
  
  /* Loop from 0 to the width of the canvas
  in steps of 50 pixels. */
  for (int i = 0; i <= width; i += 50) {
    // Draw a line from top to i/2 for every step.
    line(i, 0, i, i/2);
  }
}
draw() - noLoop();¶

/* Draw one line per frame. */
int i = 0;
void setup() {
  size(800, 400);
  background(132, 159, 211);
  stroke(211, 204, 143);
  strokeWeight(3);
  frameRate(25);
}
void draw() {
  line(i, 0, i, i/2);
  i += 10;
  
  if (i >= width) {
    noLoop();
  }
}
Instead of the for-loop from the previous example, draw is used to increase i. With if and noLoop() draw is paused when the loop is finished.
draw - loop();¶
/* Draw one line per frame and reset the 
loop on mousePressed(). */
int i = 0;
void setup() {
  size(800, 400);
  stroke(211, 204, 143);
  strokeWeight(3);
  frameRate(25);
}
void draw() {
  
  if (i == 0) {
    // set background/ clear canvas
    background(132, 159, 211);
  }
  line(i, 0, i, i/2);
  i += 10;
  
  if (i >= width) {
    // stop draw() when the end of the canvas is reached
    noLoop();
  }
}
void mousePressed() {
  // reset i and start draw()
  i = 0;
  loop();
}
See redraw() as well.
Irregular mappings¶
The previous sketches showed structures to control the program flow. Another level of control is the user interaction. Mappings provide control. If a user can easily identify the relation between user action and code action, it becomes predictable and the user is in control of the action.


/* Map the mouse position to the position of elements
in a non-regular relation. */
void setup() {
  size(500, 300);
  background(125);
  noStroke();
  noCursor();
}
void draw() {
  // Background with some transparency.
  fill(125, 100);
  rect(0, 0, width, height);
  // Color of the dots.
  fill(255);
  // Irregular mappings.
  circle(mouseX, mouseX/2, 10);
  circle(mouseY, mouseX/2, 20);
  circle(mouseX, mouseY/2, 16);
}
After some interaction this irregular mapping is identified. What about switching mappings during runtime?
