IFD:PhysicalComp2011: Difference between revisions

From Medien Wiki
mNo edit summary
Line 136: Line 136:




== 24.10.2011 Processing sketches ==
== Processing sketches ==


=== I Simple shapes ===
[[PhysicalComp2011_code|Here you find the code examples]]
 
<source lang="java">
/* SIMPLE SHAPES
*
* Get familiar with the coordinate system and the way
* shapes are beeing drawn onto the screen.
*
* Frederic Gmeiner 2011
*/
 
// define the width and height of the display window:
// 400 x 400 px
size(400,400);
 
// draw the following shapes without outlines:
noStroke();
//set the fill color of the following shapes to pure red:
fill(255,0,0);
// draw a rectangle:
rect(230,230,50,100);
// set the fill color to pure green and draw a rectangle:
fill(0,255,0);
rect(200,200,50,100);
// set the outline color to pure blue:
stroke(0,0,255);
// draw the following shapes without any fill color:
noFill();
// draw a ellipse:
ellipse(100,100,20,20);
</source>
<br /><br />
 
=== II Relations ===
 
<source lang="java">
/* RELATIONS
*
* Instead of using fixed values, we use variables
* to formulate relations. In this example a structure
* based on two vertical parallel lines with a circle
* in between is formulated.
*
* Frederic Gmeiner 2011
*/
// variable to store the radius of the circle:
int rad = 40;
// variables to store the x and y position of the structure:
int startPointX = 100;
int startPointY =100;
 
size(400,400);
 
// left line starts at the defined values and has a length of 80px:
line(startPointX, startPointY, startPointX, startPointY+80);
 
// the ellipse in between the two lines has a radius of "rad",
// so the width and hight is "2*rad". Since ellipses have their
// origin in the middle in processing, we need to add the radius
// to our "startPointX" value to have it centered in between the lines:
ellipse(startPointX+rad, startPointY+40, 2*rad, 2*rad);
 
// the right line is set in relation to the width of the circle:
line(startPointX+(2*rad), startPointY, startPointX+(2*rad), startPointY+80);
 
</source>
<br /><br />
 
=== III Functions ===
 
<source lang="java">
/* FUNCTIONS
*
* Here we define a custom function ("crossFunction()") which draws a
* cross onto the screen.
* It takes the parameters: X value, Y value and the size.
* Also the continuous mode is introduced, which
* uses the processing functions setup() and draw().
* Via the pre-defined variables "mouseX" and "mouseY" we
* can access the current mouse position.
*
* Frederic Gmeiner 2011
*/
 
// the setup() function is called everytime the program
// starts once.
void setup(){
  size(400,400);
}
 
// the draw() function is the main loop function of your program:
// after every operation in the draw function has been
// called, the draw function is called again. this
// goes on until the program quits.
void draw(){
  background(255);
  crossFunction(mouseX,mouseY,10);
}
 
// this is the definition of the custom function "crossFunction()":
void crossFunction(int crossX, int crossY, int crossSize){
  line(crossX-crossSize/2, crossY-crossSize/2, crossX+crossSize/2, crossY+crossSize/2);
  line(crossX+crossSize/2, crossY-crossSize/2, crossX-crossSize/2, crossY+crossSize/2);
}
 
</source>
<br /><br />
 
=== IV Movement & conditions ===
 
<source lang="java">
/* MOVEMENT & CONDITIONS
*
* By changing a variable during the runtime,
* we can alter the condition of the program.
* Here we increment an integer variable
* each time draw() is called. This variable is
* used for the x-position of a line, thus
* creating the illusion of a continuous movement
* from left to right.
* Via the "if" and "else" branches we can react
* to different states of the program and alter it
* accordingly.
*
* Frederic Gmeiner 2011
*/
 
// variable to store the x-position of the line:
int lineX = 0;
 
void setup(){
  size(500,300);
}
 
void draw(){
  // clear the background
  background(255);
 
  // if the x position of the line is larger than the middle of the screen:
  if(lineX > width/2){
    // change the stroke colour to pure red:
    stroke(255,0,0);
  // if the x position of the line is smaller than the middle of the screen:
  }else{
    // set the stroke coulour to black:
    stroke(0,0,0);
  }
 
  // draw a vertical line from the top (0) to the bottom ("height") at
  // the current x-position:
  line(lineX,0,lineX,height);
 
  // increment the lineX variable by 1
  // (you could also simply write "lineX++")
  lineX = lineX+1;
 
  // use the "println()" function to show the value of variables
  // in the console. this is helpful for debugging.
  println(lineX);
}
 
</source>
<br /><br />
=== Exercise I: Bouncing Line ===
This is one possible solution to achieve that the
line from the example above changes it direction
when it reaches the left and right boundaries of
the sketch window.
<source lang="java">
/* BOUNCING LINE
*
* This is a modification of the previous sketch
* so that the line will bounce off the left and
* right borders of the window. Notice the introduction
* of the variable "speed" to control the speed and
* direction of the moving line.
*
* Frederic Gmeiner 2011
*/
// variable to hold the currect x position of the line
int lineX = 0;
// variable that controls the speed and direction
int speed =1;
 
void setup(){
  size(500,300);
}
 
void draw(){
  background(204);
 
  // if the x position of the line exceeds the right border of the window:
  // change the direction by setting the speed to a negative value
  if(lineX > width){
    speed = -1;
  }
  // accordingly set the speed to a positive value as soon as the line touches
  // the left border.
  if(lineX < 0 ){
    speed = 1;
  }
 
  // here the new x position is calculated by adding the speed onto the
  // current x position. if speed is -1, lineX decreases. if speed is 1, lineX
  // increases.
  lineX = lineX + speed;
 
  // draw the line based on the calculated x position:
  line(lineX,0,lineX,height);
}
</source>
<br /><br />
 
=== Exercise II: A frightened rectangle  ===
Write a sketch that contains one rectangle with a size of 20x20px.<br />
As soon as the mouse pointer is over the rectangle, the rectangle
starts to shiver.
 
Some useful hints:
* [http://processing.org/reference/mouseX.html mouseX]
* [http://processing.org/reference/mouseY.html mouseY]
* [http://processing.org/reference/random_.html random()]
 
 
== 07.11.2011 Processing sketches ==
 
=== Exercise I: Bouncing Line (Advanced)===
 
<source lang="java">
/* BOUNCING LINE ADVANCED
*
* Notice the introduction of the variables
* "speed" and "direction to control the speed
* and direction of the moving line inependently.
*
* Frederic Gmeiner 2011
*/
 
// variable to hold the currect x position of the line
float lineX = 0;
// variable that controls the speed
float speed = 2.3f;
// variable that controls the direction
// (either 1 or -1)
int direction = 1;
 
 
void setup(){
  size(300,300);
}
 
void draw(){
 
  background(204);
 
  // if the x position of the line exceeds the right border of the window
  // OR (||) the x position of the line exceeds the left border
  // of the window:
  if(lineX > width || lineX < 0){
    direction = direction * -1; // change the direction
  }
 
  // here the new x-position is calculated by adding the speed and direction onto the
  // current x-position. if direction is -1, lineX decreases. if direction is 1, lineX
  // increases:
  lineX = lineX + (speed * direction);
 
  // draw the line based on the calculated x-position:
  line(lineX,0,lineX,height);
}
</source>
<br /><br />
 
=== Exercise II: Solution===
 
<source lang="java">
/* A FRIGHTENED SQUARE
*
* A little sketch to illustrate the random() function
* and a more complex boolean equation to check whether
* the mouse pointer is inside a rectangular shape.
*
* Frederic Gmeiner 2011
*/
 
// the x an y positions of the square:
float xPos = 200f;
float yPos = 200f;
// the width and height of the square:
int s = 20;
 
void setup(){
  size(400,400);
}
 
void draw(){
  background(204);
 
  // Here we check if the position of the mouse is somewhere inside of the
  // square. To know this, all these four contitions must be true ( && ):
  if( mouseX > xPos && mouseX < xPos + s && mouseY > yPos && mouseY < yPos + s){
      xPos += random(-2,3); // add a random value between -2 and 3 to the xPos
      yPos += random(-2,3);
      fill(40);
  }else{
    fill(255);
  }
 
  // finally draw the square:
  rect(xPos, yPos, s, s);
 
}
</source>
<br /><br />
 
 
 
=== V for() loops===
 
<source lang="java">
/* DYNAMIC DISTRIBUTION
*
* This sketch demonstrates the usage of
* a for-loop for calculating and drawing
* a certain number of ellipses according
* to the changing mouseX position.
*
* Frederic Gmeiner 2011
*/
 
 
// the number of circles:
int numCircles = 15;
 
void setup(){
  size(500,200);
  stroke(255);
  fill(150);
  smooth();
}
 
void draw(){
  background(255);
 
  // calculate the distance between the circles
  // so that in total it results in the mouseX position:
  float distance = mouseX / (numCircles-1);
 
  // for every circle (numCircles) calculate the xPos
  // and draw it onto the screen:
  for(int i=0; i < numCircles; i++){
    float xPos = i*distance;
    ellipse(xPos,100,10,10);
  }
}
</source>
<br /><br />
 
 
=== VI The array: a collection of variables===
 
<source lang="java">
/* Random points in an array
*
* This demonstrates how to store values in
* an array. This is useful when working with
* many things which share the same parameters.
* Here we use two arrays to store the coordinates
* of circles.
*
* Frederic Gmeiner 2011
*/
 
// total number of circles:
int numCircles = 40;
 
// the radius of the circles
float rad = 20f;
 
// initializing two arrays for storing the x and y positions
// of the circles:
float[] xPositions = new float[numCircles];
float[] yPositions = new float[numCircles];
 
 
void setup(){
 
  size(500,500);
  smooth();
  noStroke();
  fill(150);
 
  // iterating over the arrays to set each position with
  // a random value based on the window size:
  for(int i=0; i< numCircles; i++){
    xPositions[i] = random(0,width);
    yPositions[i] = random(0,height);
  }
}
 
 
void draw(){
 
  background(204);
 
  // again iterating over the arrays. but this time we only
  // get the x and y coordinates to draw the circles:
  for(int i=0; i< numCircles; i++){
    ellipse(xPositions[i], yPositions[i], rad, rad);
  }
 
}
</source>
<br /><br />
 
=== Exercise III ===
Modify the example VI so that the size of the circles changes over time
using the sine function sin().
 
Helpful links: <br />
[http://processing.org/learning/basics/sine.html sin() Example] <br />
[http://processing.org/learning/trig/ General introduction] (Try out the sketch by copy-pasting it into your processing editor)
<br /><br />
 
 
== 14.11.2011 Processing sketches ==
 
=== EXERCISE III: SOLUTION ===
 
<source lang="java">
/* PULSING CIRCLES
*
* Mofification of the example above so that
* the circles will shrink and grow by using
* a sinewave.
*
* Frederic Gmeiner 2011
*/
 
int numCircles = 40;
float rad = 20f;
 
// initial angle of 0. this will increase during the
// runtime of the programm and will be used to calculate
// the sine based on this value in order so modify the size of
// circles.
float angle = 0.0f;
// how fast the angle will increase is defined by the speed variable:
float speed = 0.01;
 
float[] xPositions = new float[numCircles];
float[] yPositions = new float[numCircles];
 
 
void setup(){
  size(500,500);
  smooth();
  noStroke();
  fill(150);
 
  for(int i=0; i< numCircles; i++){
    xPositions[i] = random(0,width);
    yPositions[i] = random(0,height);
  }
}
 
 
void draw(){
 
  background(204);
  // add the speed value to the angle:
  angle += speed;
 
  // calculate the diamater by calculating the sine value of the
  // angle and scaling it up by the value of 30. This is necessary since
  // the sin() funtion returns only values between -1 and 1.
  float diameter = sin(angle)*30;
 
  for(int i=0; i< numCircles; i++){
    // draw the circles:
    ellipse(xPositions[i], yPositions[i], diameter, diameter);
  }
}
 
</source>
 
<br /><br />
 
 
 
=== VII.a Another sine and cosine example ===
 
<source lang="java">
/* ELLIPTICAL MOTION
*
* A little demonstration of the sine and
* cosine relation.
*
* Frederic Gmeiner 2011
*/
 
float speed = 0.1f;  // frequency
float angle = 0.0f; // you might also call it theta
 
 
void draw(){
 
  background(200);
  angle += speed;
 
  point(50,50);
  point(50+ (cos(angle)/2*50), 50+ (sin(angle)*50));
 
}
</source>
 
<br /><br />
 
 
=== VII.b Relation of degree, PI and sine ===
 
<source lang="java">
int degr= 0;
 
println("0° Degrees:");
println("PI:" + radians(degr) / PI);
println("sine:" + round(sin(radians(degr))) + "\n");
 
degr= 90;
println("90° Degrees:");
println("PI:" + radians(degr) / PI);
println("sine:" + round(sin(radians(degr))) + "\n");
 
degr= 180;
println("180° Degrees:");
println("PI:" + radians(degr) / PI);
println("sine:" + round(sin(radians(degr))) + "\n");
 
degr= 270;
println("270° Degrees:");
println("PI:" + radians(degr) / PI);
println("sine:" + round(sin(radians(degr))) + "\n");
 
degr= 360;
println("360° Degrees:");
println("PI:" + radians(degr) / PI);
println("sine:" + round(sin(radians(degr))) + "\n");
</source>
 
<br /><br />
 
=== VIII Reading data from a text file ===
 
Imports a data table from a textfile
with tab seperated values (tsv). <br /> These
formats are very common when exporting
spreadsheets from Excel or similar software.<br />
Make sure that the file "measurements.tsv"
exists in the data folder of this sketch.
 
Download:
[[Media:PhysicalComp11_reading_tsv.zip]]
 
 
<br /><br />


[[Category:WS11]]
[[Category:WS11]]