Summary: Introductory lecture on the use of the "processing" language and environment for teaching media processing and interaction design.
| Programming Modes | ||||
| Basic | - | Sequence of commands for simple
drawing by graphic primitives. --
| ||
| Intermediate | - | Procedural programming --
| ||
| Complex | - | Object-Oriented Programming (Java) --
| ||
applet folder:
int, float, ecc.)
or to objects and arrays (tables of primitive-type
elements). b = a produces
a into
b, if the variables refer to primitive types. int[] arrayDiInteri = new int[10];
if (i == NMAX) {
println("finished");
}
else {
i++;
}
int i = 0; //integer counter
while (i < 10) { //write numbers between 0 and 9
println("i = "+ i);
i++;
}
for (int i = 0; i < 10; i++) { //write numbers between 0 and 9
println("i = "+ i);
}
int MAX = 10;
float[] tabella = new float[MAX];
for (int i = 0; i < MAX; i++)
tabella[i] = random(1); //random numbers between 0 and 1
println(tabella.length + " elements:");
println(tabella);
setup() and draw(), usable from
within setup() and draw().
int raddoppia(int i) {
return 2*i;
}
int)raddoppia)i)return 2*i)
Dot myDot;
void setup() {
size(300,20);
colorMode(RGB,255,255,255,100);
color tempcolor = color(255,0,0);
myDot = new Dot(tempcolor,0);
}
void draw() {
background(0);
myDot.draw(10);
}
class Dot
{
color colore;
int posizione;
//****CONSTRUCTOR*****//
Dot(color c_, int xp) {
colore = c_;
posizione = xp;
}
void draw (int ypos) {
rectMode(CENTER);
fill(colore);
rect(posizione,ypos,20,10);
}
}
Dot)colore, posizione)Dot())draw())Dot myDot;)myDot = new Dot(tempcolor,0))myDot.draw(10);)draw()
method we want to paint the window background with a gray
whose intensity depends on the horizontal position of the
mouse pointer.
void draw() {
background((mouseX/100)*255);
}
However, the code does not do what it is expected to do. Why?
mouseX is of
int type, and the division it is subject to is of
the integer type. It is necessary to perform a type
casting from int to float by means of the instruction
(float)mouseX. int[] a = new int[10]; a[7] = 7; int[] b = a; println(b[7]); b[7] = 8; println(a[7]); int c = 7; int d = c; println(d); d = 8; println(c);
7 8 7 7
/*
Structure 3
A surface filled with one hundred medium to small sized circles.
Each circle has a different size and direction, but moves at the same slow rate.
Display:
A. The instantaneous intersections of the circles
B. The aggregate intersections of the circles
Implemented by Casey Reas <http://groupc.net>
8 March 2004
Processing v.68 <http://processing.org>
modified by Pietro Polotti
28 March, 2006
Processing v.107 <http://processing.org>
*/
int numCircle = 100;
Circle[] circles = new Circle[numCircle];
void setup()
{
size(800, 600);
frameRate(50);
for(int i=0; i<numCircle; i++) {
circles[i] = new Circle(random(width),
(float)height/(float)numCircle * i,
int(random(2, 6))*10, random(-0.25, 0.25),
random(-0.25, 0.25), i);
}
ellipseMode(CENTER_RADIUS);
background(255);
}
void draw()
{
background(255);
stroke(0);
for(int i=0; i<numCircle; i++) {
circles[i].update();
}
for(int i=0; i<numCircle; i++) {
circles[i].move();
}
for(int i=0; i<numCircle; i++) {
circles[i].makepoint();
}
noFill();
}
class Circle
{
float x, y, r, r2, sp, ysp;
int id;
Circle( float px, float py, float pr, float psp, float pysp, int pid ) {
x = px;
y = py;
r = pr;
r2 = r*r;
id = pid;
sp = psp;
ysp = pysp;
}
void update() {
for(int i=0; i<numCircle; i++) {
if(i != id) {
intersect( this, circles[i] );
}
}
}
void makepoint() {
stroke(0);
point(x, y);
}
void move() {
x += sp;
y += ysp;
if(sp > 0) {
if(x > width+r) {
x = -r;
}
} else {
if(x < -r) {
x = width+r;
}
}
if(ysp > 0) {
if(y > height+r) {
y = -r;
}
} else {
if(y < -r) {
y = height+r;
}
}
}
}
void intersect( Circle cA, Circle cB )
{
float dx = cA.x - cB.x;
float dy = cA.y - cB.y;
float d2 = dx*dx + dy*dy;
float d = sqrt( d2 );
if ( d>cA.r+cB.r || d<abs(cA.r-cB.r) ) {
return; // no solution
}
// calculate the two intersections between the two circles cA and cB, //
// whose coordinates are (paX, paY) and (pbX, pbY), respectively. //
stroke(255-dist(paX, paY, pbX, pbY)*4);
line(paX, paY, pbX, pbY);
}
/*
Structure 3
A surface filled with one hundred medium to small sized circles.
Each circle has a different size and direction, but moves at the same slow rate.
Display:
A. The instantaneous intersections of the circles
B. The aggregate intersections of the circles
Implemented by Casey Reas <http://groupc.net>
8 March 2004
Processing v.68 <http://processing.org>
modified by Pietro Polotti
28 March, 2006
Processing v.107 <http://processing.org>
*/
int numCircle = 100;
Circle[] circles = new Circle[numCircle];
void setup()
{
size(800, 600);
frameRate(50);
for(int i=0; i<numCircle; i++) {
circles[i] = new Circle(random(width),
(float)height/(float)numCircle * i,
int(random(2, 6))*10, random(-0.25, 0.25),
random(-0.25, 0.25), i);
}
ellipseMode(CENTER_RADIUS);
background(255);
}
void draw()
{
background(255);
stroke(0);
for(int i=0; i<numCircle; i++) {
circles[i].update();
}
for(int i=0; i<numCircle; i++) {
circles[i].move();
}
for(int i=0; i<numCircle; i++) {
circles[i].makepoint();
}
noFill();
}
class Circle
{
float x, y, r, r2, sp, ysp;
int id;
Circle( float px, float py, float pr, float psp, float pysp, int pid ) {
x = px;
y = py;
r = pr;
r2 = r*r;
id = pid;
sp = psp;
ysp = pysp;
}
void update() {
for(int i=0; i<numCircle; i++) {
if(i != id) {
intersect( this, circles[i] );
}
}
}
void makepoint() {
stroke(0);
point(x, y);
}
void move() {
x += sp;
y += ysp;
if(sp > 0) {
if(x > width+r) {
x = -r;
}
} else {
if(x < -r) {
x = width+r;
}
}
if(ysp > 0) {
if(y > height+r) {
y = -r;
}
} else {
if(y < -r) {
y = height+r;
}
}
}
}
void intersect( Circle cA, Circle cB )
{
float dx = cA.x - cB.x;
float dy = cA.y - cB.y;
float d2 = dx*dx + dy*dy;
float d = sqrt( d2 );
if ( d>cA.r+cB.r || d<abs(cA.r-cB.r) ) {
return; // no solution
}
float a = (cA.r2 - cB.r2 + d2) / (2*d);
float h = sqrt( cA.r2 - a*a );
float x2 = cA.x + a*(cB.x - cA.x)/d;
float y2 = cA.y + a*(cB.y - cA.y)/d;
float paX = x2 + h*(cB.y - cA.y)/d;
float paY = y2 - h*(cB.x - cA.x)/d;
float pbX = x2 - h*(cB.y - cA.y)/d;
float pbY = y2 + h*(cB.x - cA.x)/d;
stroke(255-dist(paX, paY, pbX, pbY)*4);
line(paX, paY, pbX, pbY);
}
/*
Structure 3
A surface filled with one hundred medium to small sized circles.
Each circle has a different size and direction, but moves at the same slow rate.
Display:
A. The instantaneous intersections of the circles
B. The aggregate intersections of the circles
Implemented by Casey Reas <http://groupc.net>
8 March 2004
Processing v.68 <http://processing.org>
modified by Pietro Polotti
28 March, 2006
Processing v.107 <http://processing.org>
*/
int numCircle = 100;
Circle[] circles = new Circle[numCircle];
void setup()
{
size(800, 600);
frameRate(50);
for(int i=0; i<numCircle; i++) {
circles[i] = new Circle(random(width),
(float)height/(float)numCircle * i,
int(random(2, 6))*10, random(-0.25, 0.25),
random(-0.25, 0.25), i);
}
ellipseMode(CENTER_RADIUS);
background(255);
}
void draw()
{
background(255);
stroke(0);
if(mousePressed){
for(int i=0; i<numCircle; i++) {
circles[i].sp = mouseX*random(-5, 5)/width;
}
}
for(int i=0; i<numCircle; i++) {
circles[i].update();
}
for(int i=0; i<numCircle; i++) {
circles[i].move();
}
for(int i=0; i<numCircle; i++) {
circles[i].makepoint();
}
noFill();
}
class Circle
{
float x, y, r, r2, sp, ysp;
int id;
Circle( float px, float py, float pr, float psp, float pysp, int pid ) {
x = px;
y = py;
r = pr;
r2 = r*r;
id = pid;
sp = psp;
ysp = pysp;
}
void update() {
for(int i=0; i<numCircle; i++) {
if(i != id) {
intersect( this, circles[i] );
}
}
}
void makepoint() {
stroke(0);
point(x, y);
}
void move() {
x += sp;
y += ysp;
if(sp > 0) {
if(x > width+r) {
x = -r;
}
} else {
if(x < -r) {
x = width+r;
}
}
if(ysp > 0) {
if(y > height+r) {
y = -r;
}
} else {
if(y < -r) {
y = height+r;
}
}
}
}
void intersect( Circle cA, Circle cB )
{
float dx = cA.x - cB.x;
float dy = cA.y - cB.y;
float d2 = dx*dx + dy*dy;
float d = sqrt( d2 );
if ( d>cA.r+cB.r || d<abs(cA.r-cB.r) ) {
return; // no solution
}
float a = (cA.r2 - cB.r2 + d2) / (2*d);
float h = sqrt( cA.r2 - a*a );
float x2 = cA.x + a*(cB.x - cA.x)/d;
float y2 = cA.y + a*(cB.y - cA.y)/d;
float paX = x2 + h*(cB.y - cA.y)/d;
float paY = y2 - h*(cB.x - cA.x)/d;
float pbX = x2 - h*(cB.y - cA.y)/d;
float pbY = y2 + h*(cB.x - cA.x)/d;
stroke(255-dist(paX, paY, pbX, pbY)*4);
line(paX, paY, pbX, pbY);
}